java8新特性 stream流的方式遍历集合和数组操作
作者:光哥_帅 发布时间:2023-03-29 10:49:25
前言:
在没有接触java8的时候,我们遍历一个集合都是用循环的方式,从第一条数据遍历到最后一条数据,现在思考一个问题,为什么要使用循环,因为要进行遍历,但是遍历不是唯一的方式,遍历是指每一个元素逐一进行处理(目的),而并不是从第一个到最后一个顺次处理的循环,前者是目的,后者是方式。 所以为了让遍历的方式更加优雅,出现了流(stream)!
1.流的目的在于强掉做什么
假设一个案例:将集合A根据条件1过滤为子集B,然后根据条件2过滤为子集C
在没有引入流之前我们的做法可能为:
public class Demo02NormalFilter {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张无忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰");
List<String> zhangList = new ArrayList<>();
for (String name : list) {
if (name.startsWith("张")) {
zhangList.add(name);
}
}
List<String> shortList = new ArrayList<>();
for (String name : zhangList) {
if (name.length() == 3) {
shortList.add(name);
}
}
for (String name : shortList) {
System.out.println(name);
}
}
}
现在以流的方式实现同样的功能:
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张无忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰");
list.stream().filter(s->s.startsWith("张")).filter(s-> s.length() == 3).forEach(System.out::println);
从上面的两段代码可以看出流的存在让代码更加优雅。既然是筛选那么就直接用过滤方法就好了。
2.stream的方法
2.1 延迟方法:
这个和lambda表达式的延迟加载的原理一样,它可以进行链式编程,比如 ().filter().map().limit(),可以点下去,到最后一步(方法为count或者foreach)加载数据。这里主要介绍map和concat方法
1.filter,用来过滤
Stream<String> original = Stream.of("张无忌", "张三丰", "周芷若");
Stream<String> result = original.filter(s -> s.startsWith("张"));
result.forEach(name-> System.out.println(name));
2.map
将流中的元素映射到另一个流中,这个是在后期经常用到的,比如方法所接收的返回值是A,但是接收的却是B
这里举两个例子
例子1
将String类型的流转换为Integer 类型
Stream<String> stringStream = Stream.of("1", "2", "3", "4", "5", "6");
stringStream.map(str->Integer.parseInt(str)).forEach(System.out::println);
例子2
方法需要返回的是List <String>,但是这里只有List<Category>,此时就要想到stream().map
public List<String> queryNamesByIds(List<Long> ids){
List<Category> categories = this.categoryMapper.selectByIdList(ids);
return categories.stream().map(category -> category.getName()).collect(Collectors.toList());
}
例子3
List<Object>转化为List<Cart>,其中List<Object>中的Object为Cart的json对象
//查询购物车数据(将List<Object>变成List<Cart>)
return carts.stream().map(o -> JsonUtils.parse(o.toString(),Cart.class)).collect(Collectors.toList());
3.contract,两个流合并成一个流
Stream<String> streamA = Stream.of("张无忌","张翠山");
Stream<String> streamB = Stream.of("美羊羊","喜羊羊");
//写法1
//Stream.concat(streamA, streamB).forEach(System.out::println);
//写法2
Stream<String> result= Stream.concat(streamA, streamB);
result.forEach(name-> System.out.println(name));
2.2 终结方法:
执行完的结果不能在调用延迟方法。 如 ().filter().count().limit()这样的写法就会报错。
cout方法与foreach方法比较简单,这里不介绍了。
补充知识:JAVA Stream流的forEach遍历
Stream流的forEach:
如果希望在流当中进行元素的遍历操作,可以使用forEach方法:
forEach(Lambda)表达式,对每一个元素都要进行操作。
参数Lambda表达式必须是一个能够消费的一个参数,而且不产生数据结果的Lambda
例如:
Lambda: s -> System.out.println(s);
方法引用:System::println
println其为不会产生返回结果的Lambda
例如:对集合中每个元素的打印输出:
public class StreamForEach {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("abc");
list.add("def");
list.add("ghi");
Stream<String> streamA = list.stream();
// 对每一个元素进行打印输出
streamA.forEach((String s) -> {
System.out.println(s);
});
list.stream().forEach(s -> System.out.println(s));
list.stream().forEach(System.out::println);
}
}
来源:https://blog.csdn.net/jerry11112/article/details/101376162


猜你喜欢
- 一、dfs(深度优先搜索)1.图的dfs/** * 深度优先搜索 * * @param node * @param set */publi
- 在开发过程中,我们经常需要将数据库查询到的值放入jsp页面进行显示,在springmvc的controller中,我们采用request将数
- 生活中随处可见并行的例子,并行 顾名思义就是一起进行的意思,同样的程序在某些时候也需要并行来提高效率,在上一篇文章中我们了解了 Java 语
- 本文实例为大家分享了Unity shader实现高斯模糊效果的具体代码,供大家参考,具体内容如下正常图:高斯模糊效果图:shader代码:S
- 实现效果如下:实现思路:1、如何实现圆中水面上涨效果:利用Paint的setXfermode属性为PorterDuff.Mode.SRC_I
- 引例问题:现在有一只羊(包含属性:名字Dolly、年龄2),需要克隆10只属性完全相同的羊。一般解法:定义Sheep类表示羊,包括构造器、g
- * 惯,先上图,着急用的朋友,直接带走Demo,先拿来用吧,毕竟老板催的紧,先把工作完成了,再看也来得及,是吧!在项目中这种添加图片上传的效
- 先申明一个枚举: public enum Test_Enum  
- Cocos2d-x引擎的核心是用C++编写的,那对于所有使用该引擎的游戏开发人员来说,内存管理是一道绕不过去的坎。关于Cocos2d-x内存
- 产生私钥和公钥System.Security.Cryptography.RSACryptoServiceProvider myrsa = n
- JAVA虽然是在C++基础上发展而来,但却对C++的许多缺陷有所改进,其中一个不得不提的就是字符串,我们知道,随着学习的深入,进入MFC时,
- 编码&解码 通过下图我们可以了解在javaWeb中有哪些地方有转码:用户想服务器发送一个HTTP请求,需要编码的地方有ur
- 废话不多说了,直接给大家贴代码了,具体代码如下所述:/*** 把一个View的对象转换成bitmap*/private Bitmap get
- Android USB转串口通信开发实例详解好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平
- “深入浅出,人人都是程序员”开发过android手机的同学都知道在eclipse中可以直接查找到SHA1值,但是使用intellij ide
- 最近在做的工作要用到本地方法,需要在Java中加载不少动态链接库(以下为方便延用Windows平台下的简写dll,但并不局限于Windows
- 本文实例为大家分享了Unity实现俄罗斯方块第一部分,供大家参考,具体内容如下准备工作1、新建一个2D项目,新建成功以后设置相机的一些参数2
- 延迟队列延迟队列存储的对象肯定是对应的延时消息,所谓”延时消息”是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者
- 1、在Android studio中进行打开一个项目的文件之后,然后进行点击Android stuio中菜单中的“tools”的选项。在弹出
- 概述使用this()或target()可绑定被代理对象实例,在通过类实例名绑定对象时,还依然具有原来连接点匹配的功能,只不过类名是通过增强方