Java stream - отображать и хранить массив int в Set - PullRequest
7 голосов
/ 27 апреля 2020

У меня есть массив [5, 6, 7, 3, 9], я хотел бы изменить каждый элемент из массива, вычленяющего на 2, затем сохранить в Set, так что я сделал

Set<Integer> mySet = Arrays.stream(arr1).map(ele -> new Integer(ele - 2)).collect(Collectors.toSet());

, но Здесь я получаю два исключения:

  1. The method collect(Supplier<R>, ObjIntConsumer<R>, BiConsumer<R,R>) in the type IntStream is not applicable for the arguments (Collector<Object,?,Set<Object>>) "
  2. Type mismatch: cannot convert from Collector<Object,capture#1-of ?,Set<Object>> to Supplier<R>

Что означают эти ошибки и как я могу исправить проблему здесь с Java Stream операция?

Ответы [ 3 ]

9 голосов
/ 27 апреля 2020

Похоже, arr1 является int[] и, следовательно, Arrays.stream(arr1) возвращает IntStream. Вы не можете применить .collect(Collectors.toSet()) к IntStream.

. Вы можете применить его к Stream<Integer>:

Set<Integer> mySet = Arrays.stream(arr1)
                           .boxed()
                           .map(ele -> ele - 2)
                           .collect(Collectors.toSet());

или даже проще:

Set<Integer> mySet = Arrays.stream(arr1)
                           .mapToObj(ele -> ele - 2)
                           .collect(Collectors.toSet());
7 голосов
/ 27 апреля 2020

Arrays.stream(int[]) возвращает IntStream. И IntStream не предлагает collect() методов, которые принимают Collector.

Если вам нужно использовать Collectors.toSet(), тогда вам нужно Stream<Integer> для этого, и вы можете вызвать mapToObj для этого:

Set<Integer> mySet = Arrays.stream(arr1)
                           .mapToObj(ele -> ele - 2)
                           .collect(Collectors.toSet());
0 голосов
/ 27 апреля 2020

Вы можете использовать так:

Integer[] array = {5, 6, 7};
array = (Integer[]) Arrays.stream(array)
    .map(i -> i - 7)
    .toArray();
Set<Integer> set = new HashSet<>(Arrays.asList(array));
...