break stop java_怎么break java8 stream的foreach
怎么break java8 stream的foreach
简介
我们通常需要在java stream中遍历处理里面的数据,其中foreach是最最常用的方法。
但是有时候我们并不想处理完所有的数据,或者有时候Stream可能非常的长,或者根本就是无限的。
一种方法是先filter出我们需要处理的数据,然后再foreach遍历。
那么我们如何直接break这个stream呢?今天本文重点讲解一下这个问题。
使用Spliterator
上篇文章我们在讲Spliterator的时候提到了,在tryAdvance方法中,如果返回false,则Spliterator将会停止处理后续的元素。
通过这个思路,我们可以创建自定义Spliterator。
假如我们有这样一个stream:
Stream ints = Stream.of(1,2,3,4,5,6,7,8,9,10);
我们想定义一个操作,当x > 5的时候就停止。
我们定义一个通用的Spliterator:
public class CustomSpliterator extends Spliterators.AbstractSpliterator {
private Spliterator splitr;
private Predicate predicate;
private volatile boolean isMatched = true;
public CustomSpliterator(Spliterator splitr,Predicate predicate) {
super(splitr.estimateSize(),0);
this.splitr = splitr;
this.predicate = predicate;
}
@Override
public synchronized boolean tryAdvance(Consumer super T> consumer) {
boolean hadNext = splitr.tryAdvance(elem -> {
if (predicate.test(elem) && isMatched) {
consumer.accept(elem);
} else {
isMatched = false;
}
});
return hadNext && isMatched;
}
}
在上面的类中,predicate是我们将要传入的判断条件,我们重写了tryAdvance,通过将predicate.test(elem)加入判断条件,从而当条件不满足的时候返回false.
看下怎么使用:
@Slf4j
public class CustomSpliteratorUsage {
public static Stream takeWhile(Stream stream,Predicate predicate) {
CustomSpliterator customSpliterator = new CustomSpliterator<>(stream.spliterator(),predicate);
return StreamSupport.stream(customSpliterator,false);
}
public static void main(String[] args) {
Stream ints = Stream.of(1,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,4]
自定义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 static void forEach(Stream stream,BiConsumer consumer) {
Spliterator spliterator = stream.spliterator();
boolean hadNext = true;
Breaker breaker = new Breaker();
while (hadNext && !breaker.get()) {
hadNext = spliterator.tryAdvance(elem -> {
consumer.accept(elem,breaker);
});
}
}
}
上面的例子中,我们在forEach中引入了一个外部变量,通过判断这个外部变量来决定是否进入spliterator.tryAdvance方法。
看下怎么使用:
@Slf4j
public class CustomForEachUsage {
public static void main(String[] args) {
Stream ints = Stream.of(1,10);
List result = new ArrayList<>();
CustomForEach.forEach(ints,(elem,breaker) -> {
if (elem >= 5 ) {
breaker.stop();
} else {
result.add(elem);
}
});
log.info(result.toString());
}
}
上面我们用新的forEach方法,并通过判断条件来重置判断flag,从而达到break stream的目的。
总结
本文通过两个具体的例子讲解了如何break一个stream,希望大家能够喜欢。
欢迎关注我的公众号:程序那些事,更多精彩等着您!
更多内容请访问 www.flydean.com
相关文章
总结
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250
break stop java_怎么break java8 stream的foreach相关推荐
- 怎么break java8 stream的foreach
文章目录 简介 使用Spliterator 自定义forEach方法 总结 怎么break java8 stream的foreach 简介 我们通常需要在java stream中遍历处理里面的数据,其 ...
- Java8中的foreach跳出循环break/return
对于java8中的特殊写法lamada表达式中,不能使用break,会提示错误; java8中使用return,会跳出当前循环,继续下一次循环,作用类似continue; java8中使用foreac ...
- java8 Stream的实现原理 (从零开始实现一个stream流)
1.Stream 流的介绍 1.1 java8 stream介绍 java8新增了stream流的特性,能够让用户以函数式的方式.更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算. 1.2 ...
- java8 stream运行原理之并行流原理详解
上一篇文章<java8 stream运行原理之顺序流原理详解>介绍了顺序流的执行原理,本文接着上一篇介绍并行流的执行原理. 一.如何创建并行流 调用parallel()方法可以创建并行流, ...
- Java8 Stream流操作在用户系统中的妙用
在做目前这个项目的时候,发现以前有一个筛选的需求,老程序员是这么做的,先请求Http服务器得到一长串json数据,大概用A4纸打了40多页那么多,然后将这些对象写入到sqlite数据库中,再用数据库查 ...
- java8 stream原理
1.Stream 流的介绍 1.1 java8 stream介绍 java8新增了stream流的特性,能够让用户以函数式的方式.更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算. 1.2 ...
- JAVA8 Stream方法使用详解reduce、IntStream(二)
文章目录 一 归约 1.元素求和 2.最大值和最小值 二.数值流 1.映射数值流 2.转换对象流 3.数值范围 三.构建流 1.由值创建流 2.由数组创建流 3.由文件生成流 4.由函数生成流 此章节 ...
- java8 stream案例分析
java8 stream Stream是java8 推出的一个处理集合类的一个全新的接口,在工作当中经常用到,并且他的预发规则与我们平台的有一点不一样,是流式的处理,非常类似RXJava的一个风格. ...
- java多字段排序,java8 stream多字段排序的实现
很多情况下sql不好解决的多表查询,临时表分组,排序,尽量用java8新特性stream进行处理 使用java8新特性,下面先来点基础的 List list; 代表某集合 //返回 对象集合以类属性一 ...
最新文章
- 梅花桩上练真功,腾讯公布机器人移动技术探索新突破
- R语言dataframe数据列格式转换(从整型integer转化为浮点型float)
- EDM HTML编写建议和规范
- 让div margin属性消失_为什么div里面打一个字之后就会有高度了呢?
- SQL2008 收缩日志和数据脚本
- Get和Post请求和对应的参数获取
- Iphone如何应对华为鸿蒙系统,鸿蒙2.0向iOS看齐 系统解决了 芯片怎么办?
- MongoDB语法与现有关系型数据库SQL语法比较
- 米斯特白帽培训讲义(v2)漏洞篇 XSS
- Linux系统下文件与目录操作
- 浪潮存储进逼国际一线厂商
- matlab中Current Folder的修改
- 转李承鹏的《恰恰》,这次一定要顶他
- 用Unity实现Flat Shading
- 《汇编语言程序设计教程》人民邮电出版社第二版习题及参考答案
- 没有基于鸿蒙系统的app吗,华为鸿蒙操作系统为什么没有应用到手机?
- 处理mysql启动报错Table 'mysql.plugin' doesn't exis
- 关于Kaggle入门,看这一篇就够了
- Systemback使用精简教程
- C语言int型数据范围