use*_*966 36 java filter java-8 data-partitioning java-stream
我有一组数字:
Set<Integer> mySet = [ 1,2,3,4,5,6,7,8,9]
Run Code Online (Sandbox Code Playgroud)
我想把它分成两组赔率和赔率.
我的方法是使用过滤器两次:
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())
Run Code Online (Sandbox Code Playgroud)
我不喜欢这个解决方案,因为我经历了整套两次.
有没有更聪明的方法呢?
And*_*ner 39
Map<Boolean, List<Integer>> partitioned =
set.stream().collect(Collectors.partitioningBy(x -> x%2 == 0));
Run Code Online (Sandbox Code Playgroud)
元素partitioned.get(true)是均匀的; 元素partitioned.get(false)是奇数.
与使用此功能不同groupingBy,即使它们是空的,也可以保证地图true和false列表都会出现在地图中.(没有在Java 8中记录,但确实如此; Java 9的doc现在明确说明了它).
RAZ*_*Taz 13
简单循环和if/else将是一个简洁的解决方案
Set<Integer> setEven = new HashSet<>();
Set<Integer> setOdd = new HashSet<>();
for (Integer val : mySet) {
if (val % 2 == 0)
setEven.add(val);
else
setOdd.add(val);
}
Run Code Online (Sandbox Code Playgroud)
或者使用三元运算符可以更好地简化代码
for(Integer val : mySet) {
((val % 2 == 0) ? setEven : setOdd).add(val);
}
Run Code Online (Sandbox Code Playgroud)
Ami*_*era 13
你可以使用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));
Run Code Online (Sandbox Code Playgroud)
tso*_*akp 11
你可以使用Collectors.partitioningBy:
Map< Boolean, Set<Integer> > map =
mySet.stream().collect( Collectors.partitioningBy( y -> y % 2 == 0,
Collectors.toSet() ) );
Set<Integer> odds = map.get(Boolean.TRUE);
Set<Integer> evens = map.get(Boolean.FALSE);
Run Code Online (Sandbox Code Playgroud)
编辑:
我看到有几个类似的答案.这里的细微差别在于它显示了如何获取集合Set而不是List,以防OP想要这样.
| 归档时间: |
|
| 查看次数: |
1963 次 |
| 最近记录: |