JAVA研发狄仁杰 5万字:Stream和Lambda表达式最佳实践2( 七 )


我们定义了一个takeWhile方法 , 接收Stream和predicate条件 。
只有当predicate条件满足的时候才会继续 , 我们看下输出的结果:[main]INFOcom.flydean.CustomSpliteratorUsage-[1,2,3,4]复制代码13.2自定义forEach方法
除了使用Spliterator , 我们还可以自定义forEach方法来使用自己的遍历逻辑:publicclassCustomForEach{publicstaticclassBreaker{privatevolatilebooleanshouldBreak=false;publicvoidstop(){shouldBreak=true;}booleanget(){returnshouldBreak;}}publicstaticvoidforEach(Streamstream,BiConsumer
consumer){Spliterator
{consumer.accept(elem,breaker);});}}}复制代码
上面的例子中 , 我们在forEach中引入了一个外部变量 , 通过判断这个外部变量来决定是否进入spliterator.tryAdvance方法 。
看下怎么使用:@Slf4jpublicclassCustomForEachUsage{publicstaticvoidmain(String[]args){Stream
ints=Stream.of(1,2,3,4,5,6,7,8,9,10);List
result=newArrayList
{if(elem>=5){breaker.stop();}else{result.add(elem);}});log.info(result.toString());}}复制代码
上面我们用新的forEach方法 , 并通过判断条件来重置判断flag , 从而达到breakstream的目的 。 14.predicatechain的使用
Predicate是一个FunctionalInterface , 代表的方法需要输入一个参数 , 返回boolean类型 。 通常用在stream的filter中 , 表示是否满足过滤条件 。 booleantest(Tt);复制代码14.1基本使用
我们先看下在stream的filter中怎么使用Predicate:@TestpublicvoidbasicUsage(){List
stringList=Stream.of("a","b","c","d").filter(s->s.startsWith("a")).collect(Collectors.toList());log.info("{}",stringList);}复制代码
上面的例子很基础了 , 这里就不多讲了 。 14.2使用多个Filter
如果我们有多个Predicate条件 , 则可以使用多个filter来进行过滤:publicvoidmultipleFilters(){List
stringList=Stream.of("a","ab","aac","ad").filter(s->s.startsWith("a")).filter(s->s.length()>1).collect(Collectors.toList());log.info("{}",stringList);}复制代码
上面的例子中 , 我们又添加了一个filter , 在filter又添加了一个Predicate 。 14.3使用复合Predicate
Predicate的定义是输入一个参数 , 返回boolean值 , 那么如果有多个测试条件 , 我们可以将其合并成一个test方法:@TestpublicvoidcomplexPredicate(){List
stringList=Stream.of("a","ab","aac","ad").filter(s->s.startsWith("a")&&s.length()>1).collect(Collectors.toList());log.info("{}",stringList);}复制代码
上面的例子中 , 我们把s.startsWith("a")&&s.length()>1作为test的实现 。 14.4组合Predicate
Predicate虽然是一个interface , 但是它有几个默认的方法可以用来实现Predicate之间的组合操作 。
比如:Predicate.and(),Predicate.or(),和Predicate.negate() 。
下面看下他们的例子:@TestpublicvoidcombiningPredicate(){Predicate
predicate1=s->s.startsWith("a");Predicate
predicate2=s->s.length()>1;List
stringList1=Stream.of("a","ab","aac","ad").filter(predicate1.and(predicate2)).collect(Collectors.toList());log.info("{}",stringList1);List
stringList2=Stream.of("a","ab","aac","ad").filter(predicate1.or(predicate2)).collect(Collectors.toList());log.info("{}",stringList2);List
stringList3=Stream.of("a","ab","aac","ad").filter(predicate1.or(predicate2.negate())).collect(Collectors.toList());log.info("{}",stringList3);}复制代码


推荐阅读