int []转换为Hashset(Java)

时间:2018-10-26 13:28:41

标签: java arrays java-8 set java-stream

可能是Java int[] array to HashSet<Integer>的副本,但未能回答如此新的问题。

我有一个要声明的集合:

int[] flattened = Arrays.stream(arcs).flatMapToInt(Arrays::stream).toArray();
Set<Integer> set = new HashSet<Integer>(Arrays.asList(flattened));

,但是由于Arrays.asList的返回类型本身就是一个列表,因此无法解析。 将int[]的列表转换为Set<Integer>

的最佳方法是什么

2 个答案:

答案 0 :(得分:5)

  

..将int []的列表转换为   设置

在这种情况下,您可以使用:

List<int[]> arcs = ...;
Set<Integer> set = arcs.stream()
        .flatMapToInt(Arrays::stream)
        .boxed()
        .collect(Collectors.toSet());

示例:

List<int[]> arcs = new ArrayList<>(Arrays.asList(new int[]{1, 2, 3}, new int[]{3, 4, 6}));

输出

[1, 2, 3, 4, 6]

注意:如Jack所述,要确保收藏为HashSet,您可以这样收集:

...
.collect(Collectors.toCollection(() -> new HashSet<>()));

答案 1 :(得分:4)

您应该能够像这样单线操作:

Set<Integer> set = Arrays.stream(arcs).flatMapToInt(Arrays::stream).collect(Collectors.toSet());

已更新:杰克在下面的评论中说,不能保证Collectors.toSet()返回一个HashSet-实际上,我认为通常会这样做,但不能保证-因此使用它会更好:

Set<Integer> set = Arrays.stream(arcs).flatMapToInt(Arrays::stream)
  .collect(Collectors.toCollection(() -> new HashSet<>()));

正如DodgyCodeException所指出的那样,OP的示例还有一个我没有解决的附加问题,因此请使用以下方法进行调整:

Set<Integer> set = Arrays.stream(arcs)
    .flatMapToInt(Arrays::stream)
    .boxed() // <-- converts from IntStream to Stream<Integer>
    .collect(Collectors.toCollection(() -> new HashSet<>()));