在Java8的Streams中,我知道如何根据谓词过滤集合,并处理谓词为真的项目。我想知道的是,如果谓词只将集合分成两组,是否可以通过API基于谓词进行过滤,处理过滤后的结果,然后立即链接处理所有被过滤器排除的元素?例如,考虑以下列表:ListintList=Arrays.asList(1,2,3,4);是否可以这样做:intList.stream().filter(lessThanThree->lessThanThree或者我是否只需要为过滤后的项目执行forEach过程,然后调用stream()和filter()原始列表然后处理剩余的项目?谢谢! 最佳答
partitioningBy收集器将谓词应用于流中的每个元素,并生成从boolean值到流中满足或不满足谓词的元素列表的映射。例如:Stream.of(1,2,3,4).collect(partitioningBy(x->x>=3))//{false=[1,2],true=[3,4]}如What'sthepurposeofpartitioningBy中所述,观察到的行为是partitioningBy总是返回一个包含true和false条目的映射。例如:Stream.empty().collect(partitioningBy(x->false));//{false=[],true=[]
例如,如果我打算对一些元素进行分区,我可以这样做:Stream.of("I","Love","StackOverflow").collect(Collectors.partitioningBy(s->s.length()>3)).forEach((k,v)->System.out.println(k+"=>"+v));哪个输出:false=>[I]true=>[Love,StackOverflow]但对我来说partioningBy只是groupingBy的子情况.虽然前者接受Predicate作为参数,而后者是Function,我只是把一个分区看作是一个普通的分组函数。所以同样的代码