Java8 Stream 初探(一)
来源:互联网 发布:如何在淘宝上搜高仿 编辑:程序博客网 时间:2024/05/18 14:22
Java8 Stream 初探(一)
Java8是自java5发布以来变动最大的一个版本,添加了一系列新特性,其中最引人注目的个人觉得要属于lambda表达式,新版本的位于java.util.stream API,函数是编程等,之前一直没有研究过,最近有空抽个时间,研究了下关于stream的一些常用方法,越来越觉得编程中使用stream的便利性,下面会给出一些常用的例子做一些说明讲解,算是对自己这段时间研究stream的一个补充。
鉴于网络上对于stream以及lambda的一些入门介绍已经比较详细了,本文不打算从0开始讲解lambda以及stream,更多的是就我所学的东西写一些实例出来,毕竟我在看这一块资料的时候,很多讲解缺乏一些常见的应用实例,看以下示例之前,读者需要先了解什么是lambda以及stream,想了解这部分的基础知识,不放可以看下以下的两个链接
lambda介绍:http://news.oneapm.com/java-8-oneapm-lambda
stream介绍:http://ifeve.com/stream
个人觉得上述两篇博文写的挺好的,浅显易懂,尤其是第二篇讲述stream,借助图表的方式讲的特别透彻。
ok,下面进入正题,一些示例以及常见的使用场景
场景1:
- 拿到一个List列表,将其转换为以逗号分隔的字符串,这种转换方式尤以在代码发送http请求的时候经常遇到
来看看常见的解决此方案的方法:
public static String createStringFromIds(List<String> ids){ StringBuilder sb = new StringBuilder(); for(Integer id:ids){ sb.append(id).append(","); } String idStr = sb.toString(); return idStr.subString(0,idStr.len()-1);}
写一个方法,对list列表做一个遍历,然后append到一个StringBuilder中,最后做一个字符截取操作,下面来看看用Java8 stream 的实现方式:
String idStr=strList.stream().collect(Collectors.joining(","));
一行代码,是不是简介了很多,而且还不用做最后哪一步的字符串截取操作,无论从代码行数,整洁程度,可读性都比上面哪一种方式好太多了,(在jdk1.8之前想实现上述代码可以借助于google 的guava类库,用Joiner实现类似方式,不过1.8之后jdk原生就支持了这种操作方式,何乐而不为呢,下述一些其他的示例基本都可以借助guava实现,感兴趣的同学可以去研究下guava的用法)。
场景2
List strIds为一个String类型的id列表,我们的下层接口参数列表类型为List类型,来看看常见解决方案:
public static List<Integer> str2IntegerList(List<String> strs){ List<Integer> list = new ArrayList<>(); for(String str:strs){ list.add(Integer.parseInt(str)); } return list;}
Stream api 实现方式:
List<Integer> integers = strList.stream().map((str)->Integer.parseInt(str)).collect(Collectors.toList());
跟场景1类似,同样的一行代码完成了我们之前3-4行代码的内容
场景三:取某个对象列表里面的单个属性
解决方案一:
public class Foo{ public int id; public String name; public int age; public Date createTime;}
上述例子为一个简单的pojo类,为了简便起见,直接将属性写成了public方式,懒得写get/set方法了,原理是一样的
public static List<Integer> getFooIds(List<Foo> foos){ List<Integer> ids = new ArrayList<>(); for(Foo foo:foos){ ids.add(foo.id); } return ids;}
Stream API:
List<Foo> foos = getFoosFromSomeWhere();List<Integer> ids = foos.stream().map((foo)->foo.id).collect(Collectors.toList());
休息一下,我们看看上述的三个示例,我相信绝大多数的java开发人员都曾经碰到过类似的问题,对比看,三个stream api示例中,出现最多的几个方法:stream(),map(),collect(),大致坐下说明:
stream():创建一个stream流(stream基本都是基于java collection对象创建的)
map():类型转换,将一个给定类型的实例转换为另外一个实例,上述示例中String->int,Foo->int等,stream可以接多个map方法,示例二中的String-int你甚至也可以这样写(只要你愿意。。。):
List<Integer> integers = strList.stream().map((str)->Integer.parseInt(str)).map((i)->i+"").map((str)->Integer.parseInt(str)).collect(Collectors.toList());
- collect():字面意思是收集的意思,可以将其简单的理解为将前面转换过后的对象进行收集,jdk提供一个Collectors类,里面有很多预定义好的”收集器”。
ok,今天先写到这,后续会逐步添加一些其他功能的示例,常见的方法有filter ,map,collect,groupby等等操作,这些操作更多的出现于关系数据库中,jdk1.8之前的集合类要实现这些功能需要自己写业务逻辑去实现,不过这些操作在jdk1.8中,绝大多数操作都可以借助于stream api方式取实现。
- Java8 Stream 初探(一)
- Java8 新方法之 Stream(一)
- Java8 Stream
- java8 stream
- Java8 Stream
- Java8 Stream
- Java8:Stream
- java8-stream
- java8 stream
- Java8 Stream
- Java8 Stream
- Java8 stream
- java8 stream
- java8-stream
- Java8 Stream
- java stream API初探(一):为了简洁
- java8初探
- Java8 Lambda表达式与Stream API (一):Lambda表达式
- codeforces-148D Bag of mice【概率dp】
- 常用数据结构汇总
- 【数据结构】构造二叉树的三种方法
- 16色工具栏
- apach服务器使用以及设置
- Java8 Stream 初探(一)
- C语言实现直接法解线性方程组
- 一个改进造成的血案
- tslib编译与安装
- cmd中javac 和 java的用法
- OBIEE权限控制
- Coverity 静态分析 VS Code Review 代码审查
- 3712: [PA2014]Fiolki LCA 思路题
- SPL标准库学习笔记