Java 流 - 将 int 数组映射并存储到 Set 中

Kev*_*ing 8 java collections java-stream

我有一个 的数组[5, 6, 7, 3, 9],我想将数组中的每个元素减去 2,然后将其存储在 a 中Set,所以我所做的是

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

但我在这里有两个例外

  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操作解决这里的问题?

Era*_*ran 10

它看起来像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());
Run Code Online (Sandbox Code Playgroud)

甚至更简单:

Set<Integer> mySet = Arrays.stream(arr1)
                           .mapToObj(ele -> ele - 2)
                           .collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)


ern*_*t_k 7

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());
Run Code Online (Sandbox Code Playgroud)