компилятор, выдающий общую ошибку в Collectors toMap - PullRequest
3 голосов
/ 02 ноября 2019

Я писал одно простое выражение, в котором мне нужно собрать Map из String против списка индексов из массива. Для этого я пытаюсь использовать

 Collectors.toMap(keyMapper, valueMapper, mergeFunction).

Суть в следующем.

    Map<String, List<Integer>> sortedStringToIndex = IntStream.range(0, strs.length)
 .mapToObj(i -> new AbstractMap.SimpleEntry<String,Integer>(sortString(strs[i]),i))
 .collect(Collectors.toMap((Map.Entry<String,Integer> pair) -> pair.getKey(),
            (Map.Entry<String,Integer> pair) -> {
        List<Integer> val = new ArrayList<>(){{add(pair.getValue());}};
        return val;
        }, (List<Integer> index1, List<Integer> index2) ->  index1.addAll(index2)));

Но это дает мне следующую ошибку.

метод java.util.stream.Collectors.toMap (java.util.function.Function, java.util.function. Функция java.util.function.BinaryOperator) не применяется (переменная логического вывода U имеет несовместимые ограничения равенства границ: java.util.List нижние границы: java.lang.Boolean, java.util.List)

Может кто-нибудь объяснить, пожалуйста, ошибку компилятора и как это исправить. Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 02 ноября 2019

Взгляните на javadoc . Это потому, что List#addAll производит boolean, его нельзя использовать в качестве функции нисходящего потока. Вы можете использовать потоки:

Stream.concat(index1.stream(), index2.stream())
                         .collect(Collectors.toList())

Или использовать коллекции Apache Commons:

ListUtils.union(index1, index2)
0 голосов
/ 02 ноября 2019

Или так, если вы хотите следовать своему коду:

 (index1, index2) -> {
                        index1.addAll(index2);
                        return index1;
                    }

полная версия:

 Map<String, List<Integer>> sortedStringToIndex = IntStream.range(0, strs.length)
            .mapToObj(i -> new AbstractMap.SimpleEntry<>(sortString(strs[i]), i))
            .collect(Collectors.toMap(
                              AbstractMap.SimpleEntry::getKey,
                              pair -> new ArrayList<>(Collections.singletonList(pair.getValue())),
                              (l1, l2) -> {l1.addAll(l2);return l1; }
                           )
                   );
...