什么是Stream
Java 8 API添加了一个新的抽象称为流Stream,用于对集合数据进行处理,可以理解为流水线。首先定义好中间的加工步骤(对于数据的各种操作比如筛选,排序,聚合),最后由最终操作得到前面处理的结果。
Stream让我可以用一种声明的方式处理数据。让程序员只关注于“做什么”,而不是“怎么做”,极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
举个例子
假设我们要对一个列表进行遍历输出,首先想到的方式就是写一个for循环。
List<String> list = new ArrayList<>();
list.add("跑步");
list.add("游泳");
list.add("篮球");
list.add("滑雪");
for(String s : list){
System.out.println(s);
}
其中 System.out.println(s)
这条语句是我们的目的即“做什么”,而for循环是做这件事情的方式即“怎么做”。
在不同的业务场景中,我们对于集合里的数据会进行很多操作,比如遍历、排序、分类、过滤等等,Stream对于这些操作进行封装,让我们只关注于业务逻辑本身,而不去想如何实现这些数据操作。
如果这一段看不太懂也没关系,随着项目经验的增加自然会懂。
💥“两句话” 用好 Stream
- 定义对于数据的操作方式,即你想如何处理这些数据。我们可以定义多个处理步骤,比如先过滤再排序最后遍历等等……
- 定义对于数据的输出格式,即你想以哪种格式把保存经过处理后的数据。
再来个例子
模拟一个数据源,一个HashMap,记录了LOL中每个英雄的姓名与得分
Map<String, Integer> fMap = new HashMap<>();
fMap.put("托儿索", 78);
fMap.put("劫", 97);
fMap.put("皮城女警", 88);
fMap.put("麦林炮手", 108);
fMap.put("诺手", 90);
需求:
- 剔除名字长度为1的英雄
- 按照成绩从低到高排序
- 得到学生姓名的列表
实现:
List<String> s = fMap.entrySet().stream()
.filter(item -> item.getKey().length() > 1) //定义操作: 剔除名字长度为1的英雄
.sorted(Comparator.comparing(Map.Entry::getValue)) //定义操作: 按照成绩从低到高排序
.map(Map.Entry::getKey) //定义操作: 得到学生姓名的列表
.collect(Collectors.toList()); // 输出结果
System.out.println(s.toString());
如果看到这里还体会不到stream强大之处的同学,可以尝试一下不用stream来实现上述需求,然后对比一下代码,感觉就到位了😏。
结尾
这里仅仅是简单介绍了什么是 Stream 以及它的大概用法,主要是先对Stream有个感性的认知,下篇文章会介绍Stream的详细用法。