Преобразование лямбда-выражения Kotlin в Java - PullRequest
0 голосов
/ 13 марта 2019

Мне нужно преобразовать следующее в Java 8, однако я не уверен в необходимом синтаксисе.

val iterator = color.toList().iterator()
iterator.forEach { cols->

    println("$cols count: " + 
            (numbers
            .map{a -> colors[a]}                                           
            .count{it == (cols)})
)
}

Существует 30 чисел от 1 до 5, соответствующих массиву строк (цветов, в списке списков)

Я должен подсчитать вхождения каждого цвета, например

green count:9

red count:3

Это то, что я получил до сих пор

    List<String> colors = new ArrayList<>();
    //list filled

    colors.stream().forEach(cols ->
            System.out.println(cols + " count: " + numbers2
                            .mapToObj(i -> colorsarray[i])
                            .count()
                    ));

Однако он ничего не печатает.colorsarray [] - это обычный массив String с теми же значениями, что и ArrayList, но я создал arraylist, так как не знал, как выполнять лямбда-операции с обычным массивом.

Ответы [ 3 ]

2 голосов
/ 13 марта 2019

Возможно, вам нужен счетчик groupingBy цвета как:

List<String> input = new ArrayList<>(); // initialised with colors

Map<String, Long> colorCount = input.stream()
                   .collect(Collectors.groupingBy(i -> i, Collectors.counting()));

colorCount.forEach((k,v) -> System.out.println(k + " count: " + v));
2 голосов
/ 13 марта 2019

Kotlin's count принимает лямбду, возвращающую логическое значение в качестве параметра, и считает только элементы, которые удовлетворяют предикату. Вы должны суммировать вхождения (идея фильтра взята из @biziclop, спасибо):

colors.stream().forEach(cols ->
        System.out.println(cols + " count: " + numbers2
                        .mapToObj(i -> colors[i])
                        .filter(c -> c.equals(cols))
                        .count()
                ));
0 голосов
/ 13 марта 2019

Я предполагаю, что у вас есть что-то вроде этого:

List<String> colors   = Arrays.asList("blue","red", "green", "yellow", "black");
List<Integer> numbers = Arrays.asList(1,3,0,0,2,3,1,4,0,2,4,3,3,3,2,0);

значения в списке чисел, соответствующие индексам в списке цветов.Если это так, то сделайте что-то вроде того, что @Naman уже предложил:

Map<String, Long> colorCount = numbers.stream()
               .collect(Collectors.groupingBy(i -> colors.get(i), Collectors.counting()));

colorCount.forEach((k,v) -> System.out.println(k + " count: " + v));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...