技术编程5万字:Stream和Lambda表达式最佳实践2( 七 )


在上面的类中 , predicate是我们将要传入的判断条件 , 我们重写了tryAdvance , 通过将predicate.test(elem)加入判断条件 , 从而当条件不满足的时候返回false.
看下怎么使用:@Slf4jpublic class CustomSpliteratorUsage {public staticStream takeWhile(Stream stream, Predicate predicate) {CustomSpliterator
(stream.spliterator(), predicate);return StreamSupport.stream(customSpliterator, false);}public static void main(String[] args) {Stream
ints = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);List
result =takeWhile(ints, x -> x < 5 ).collect(Collectors.toList());log.info(result.toString());}}复制代码
我们定义了一个takeWhile方法 , 接收Stream和predicate条件 。
只有当predicate条件满足的时候才会继续 , 我们看下输出的结果:[main] INFO com.flydean.CustomSpliteratorUsage - [1, 2, 3, 4]复制代码13.2 自定义forEach方法
除了使用Spliterator , 我们还可以自定义forEach方法来使用自己的遍历逻辑:public class CustomForEach {public static class Breaker {private volatile boolean shouldBreak = false;public void stop() {shouldBreak = true;}boolean get() {return shouldBreak;}}public staticvoid forEach(Stream stream, BiConsumer
consumer) {Spliterator
{consumer.accept(elem, breaker);});}}}复制代码
上面的例子中 , 我们在forEach中引入了一个外部变量 , 通过判断这个外部变量来决定是否进入spliterator.tryAdvance方法 。
看下怎么使用:@Slf4jpublic class CustomForEachUsage {public static void main(String[] args) {Stream
ints = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);List
result = new ArrayList
{if (elem >= 5 ) {breaker.stop();} else {result.add(elem);}});log.info(result.toString());}}复制代码
上面我们用新的forEach方法 , 并通过判断条件来重置判断flag , 从而达到break stream的目的 。 14. predicate chain的使用
Predicate是一个FunctionalInterface , 代表的方法需要输入一个参数 , 返回boolean类型 。 通常用在stream的filter中 , 表示是否满足过滤条件 。 boolean test(T t);复制代码14.1 基本使用
我们先看下在stream的filter中怎么使用Predicate:@Testpublic void basicUsage(){List
stringList=Stream.of("a","b","c","d").filter(s -> s.startsWith("a")).collect(Collectors.toList());log.info("{}",stringList);}复制代码
上面的例子很基础了 , 这里就不多讲了 。 14.2 使用多个Filter
如果我们有多个Predicate条件 , 则可以使用多个filter来进行过滤:public void multipleFilters(){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方法:@Testpublic void complexPredicate(){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


推荐阅读