怎么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相关推荐

  1. 怎么break java8 stream的foreach

    文章目录 简介 使用Spliterator 自定义forEach方法 总结 怎么break java8 stream的foreach 简介 我们通常需要在java stream中遍历处理里面的数据,其 ...

  2. Java8中的foreach跳出循环break/return

    对于java8中的特殊写法lamada表达式中,不能使用break,会提示错误; java8中使用return,会跳出当前循环,继续下一次循环,作用类似continue; java8中使用foreac ...

  3. java8 Stream的实现原理 (从零开始实现一个stream流)

    1.Stream 流的介绍 1.1 java8 stream介绍 java8新增了stream流的特性,能够让用户以函数式的方式.更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算. 1.2  ...

  4. java8 stream运行原理之并行流原理详解

    上一篇文章<java8 stream运行原理之顺序流原理详解>介绍了顺序流的执行原理,本文接着上一篇介绍并行流的执行原理. 一.如何创建并行流 调用parallel()方法可以创建并行流, ...

  5. Java8 Stream流操作在用户系统中的妙用

    在做目前这个项目的时候,发现以前有一个筛选的需求,老程序员是这么做的,先请求Http服务器得到一长串json数据,大概用A4纸打了40多页那么多,然后将这些对象写入到sqlite数据库中,再用数据库查 ...

  6. java8 stream原理

    1.Stream 流的介绍 1.1 java8 stream介绍 java8新增了stream流的特性,能够让用户以函数式的方式.更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算. 1.2  ...

  7. JAVA8 Stream方法使用详解reduce、IntStream(二)

    文章目录 一 归约 1.元素求和 2.最大值和最小值 二.数值流 1.映射数值流 2.转换对象流 3.数值范围 三.构建流 1.由值创建流 2.由数组创建流 3.由文件生成流 4.由函数生成流 此章节 ...

  8. java8 stream案例分析

    java8 stream Stream是java8 推出的一个处理集合类的一个全新的接口,在工作当中经常用到,并且他的预发规则与我们平台的有一点不一样,是流式的处理,非常类似RXJava的一个风格. ...

  9. java多字段排序,java8 stream多字段排序的实现

    很多情况下sql不好解决的多表查询,临时表分组,排序,尽量用java8新特性stream进行处理 使用java8新特性,下面先来点基础的 List list; 代表某集合 //返回 对象集合以类属性一 ...

最新文章

  1. 梅花桩上练真功,腾讯公布机器人移动技术探索新突破
  2. R语言dataframe数据列格式转换(从整型integer转化为浮点型float)
  3. EDM HTML编写建议和规范
  4. 让div margin属性消失_为什么div里面打一个字之后就会有高度了呢?
  5. SQL2008 收缩日志和数据脚本
  6. Get和Post请求和对应的参数获取
  7. Iphone如何应对华为鸿蒙系统,鸿蒙2.0向iOS看齐 系统解决了 芯片怎么办?
  8. MongoDB语法与现有关系型数据库SQL语法比较
  9. 米斯特白帽培训讲义(v2)漏洞篇 XSS
  10. Linux系统下文件与目录操作
  11. 浪潮存储进逼国际一线厂商
  12. matlab中Current Folder的修改
  13. 转李承鹏的《恰恰》,这次一定要顶他
  14. 用Unity实现Flat Shading
  15. 《汇编语言程序设计教程》人民邮电出版社第二版习题及参考答案
  16. 没有基于鸿蒙系统的app吗,华为鸿蒙操作系统为什么没有应用到手机?
  17. 处理mysql启动报错Table 'mysql.plugin' doesn't exis
  18. 关于Kaggle入门,看这一篇就够了
  19. Systemback使用精简教程
  20. C语言int型数据范围

热门文章

  1. shell中的重定向(21)
  2. 数据库面试题之PL/SQL面试题
  3. 线程池(领导者-追随者,生产者-消费者等)小结
  4. winform C#中Byte与String的转换方法,相互转换
  5. Exception in Tkinter callback
  6. 基于tensorflow 批量修改自己的图片数据集 (附代码)
  7. Go 系列教程 —— 26. 结构体取代类
  8. 2091操作系统引论
  9. Mysql启动找不到mysql.sock文件问题(Centos7)
  10. 【weiphp微信开发教程】留言板插件开发详解