是否有一种方法可以在一个处理中收集流的匹配元素和不匹配元素? 举个例子:
final List<Integer> numbers = Arrays.asList( 1, 2, 3, 4, 5 );
final List<Integer> even = numbers.stream().filter( n -> n % 2 == 0 ).collect( Collectors.toList() );
final List<Integer> odd = numbers.stream().filter( n -> n % 2 != 0 ).collect( Collectors.toList() );
有没有一种方法可以避免两次浏览数字列表?诸如“用于匹配的收集器和用于不匹配的收集器”之类的东西?
答案 0 :(得分:30)
您可以这样做
Map<Boolean, List<Integer>> oddAndEvenMap = numbers.stream()
.collect(Collectors.partitioningBy(n -> n % 2 == 0));
final List<Integer> even = oddAndEvenMap.get(true);
final List<Integer> odd = oddAndEvenMap.get(false);
答案 1 :(得分:7)
例如,如果您有2个以上的组(而不是奇数,甚至在这里使用%2)来对剩余类%3中的整数进行分组,则可以使用函数:
Function<Integer, Integer> fun = i -> i%3;
List<Integer> a = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
Map<Integer, List<Integer>> collect = a.stream().collect(Collectors.groupingBy(fun));
System.out.println(collect);
//{0=[3, 6, 9], 1=[1, 4, 7, 10], 2=[2, 5, 8]}
或者想象您有一个想要通过启动char进行分组的字符串列表 而不是将匹配和不匹配分组(例如,以a开头或不以a开头) 你可以做类似的事情:
Function<String, Character> fun = s -> s.charAt(0);
List<String> a = Arrays.asList("baz","buzz","azz","ayy","foo","doo");
Map<Character, List<String>> collect = a.stream().collect(Collectors.groupingBy(fun));
System.out.println(collect);
//{a=[azz, ayy], b=[baz, buzz], d=[doo], f=[foo]}