使用 Java 8 个流将 [0..n]、[n+1..l] 元素收集到单独的集合中的最佳方法是什么?

What is the best way to collect [0..n], [n+1..l] elements in separate sets using Java 8 streams?

我有一个 HashSet,我需要使用 Java 8 个流在一个 HashSet 中收集 [0..n] 个元素,在另一个 HashSet 中收集 [n+1...l] 个元素。其中n >=0 是任意数,l >=0是给定HashSet的长度。

resultSet1 = set.stream()
.limit(n)
.collect(Collectors.toSet());

上面给了我 [0..n] 个元素。 我可以再次调用 stream(),然后调用 skip(),但问题是 java 中的 HashSet 是无序的,因此 skip 方法有可能跳过上面未收集的元素。

resultSet2 = set.stream()
.skip(n)
.collect(Collectors.toSet());

我可以使用传统的 for,但使用流的解决方案会很棒。

例如 given set = {1,2,3,4,5} resultSet1 = {1,2} resultSet2 = {3,4,5}

这里有一个方法可以解决这个问题

Set firstSet = set.stream()
                  .limit(n)
                  .collect(toSet());

Set secondSet = new HashSet<>(set);
secondSet.removeAll(firstSet);

第二种方法是

AtomicInteger atomicInteger = new AtomicInteger();
Set<Integer> set = Set.of(1, 2, 3, 4, 5);
int n = 2;

Map<Boolean, Set<Integer>> map = 
     set.stream()
        .collect(
             Collectors.partitioningBy(
                 $ -> atomicInteger.addAndGet(1) > n), 
                 Collectors.toSet()
        );

使用partitioningBy() with a toSet()下游收集器:

int[] i = {0}; // the array is "effectively final"
Map<Boolean, Set<Integer>> map = set.stream()
  .collect(Collectors.partitioningBy(x -> i[0]++ < n, toSet()));

您可以使用最终有效的 int[] 来保存 lambda 中引用的计数器,这可能会改变其 内容