使用 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 中引用的计数器,这可能会改变其 内容。
我有一个 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 中引用的计数器,这可能会改变其 内容。