将一个集合划分为 2 个不同集合的最佳方法是什么?

我有一组数字:

 Set<Integer> mySet = [ 1,2,3,4,5,6,7,8,9]

我想把它分成2组赔率和偶数。

我的方式是使用过滤器两次:

Set<Integer> set1 = mySet.stream().filter(y -> y % 2 == 0).collect(Collectors.toSet())
Set<Integer> set2 =mySet.stream().filter(y -> y % 2 != 0).collect(Collectors.toSet())

我不喜欢这个解决方案,因为我对整个集合进行了两次检查。

有没有更聪明的方法来做到这一点?


答案 1
Map<Boolean, List<Integer>> partitioned = 
    set.stream().collect(Collectors.partitioningBy(x -> x%2 == 0));

中的元素是均匀的;中的元素是奇怪的。partitioned.get(true)partitioned.get(false)

与使用 不同,可以保证和列表都存在于映射中,即使它们都是空的。(在Java 8中没有记录,但这是真的;Java 9的文档现在明确声明了它)。groupingBytruefalse


答案 2

您可以像下面这样使用。Collectors#partitioningBy

Map<Boolean,List<Integer>> evenOddMap  = mySet.stream().collect(Collectors.partitioningBy(e -> e % 2 == 0));
System.out.println("Even : "+evenOddMap.get(true));
System.out.println("Odd : "+evenOddMap.get(false));

推荐