什么是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

  1. 定义对于数据的操作方式,即你想如何处理这些数据。我们可以定义多个处理步骤,比如先过滤再排序最后遍历等等……
  2. 定义对于数据的输出格式,即你想以哪种格式把保存经过处理后的数据。

再来个例子

模拟一个数据源,一个HashMap,记录了LOL中每个英雄的姓名与得分

Map<String, Integer> fMap = new HashMap<>();
fMap.put("托儿索", 78);
fMap.put("劫", 97);
fMap.put("皮城女警", 88);
fMap.put("麦林炮手", 108);
fMap.put("诺手", 90);

需求:

  1. 剔除名字长度为1的英雄
  2. 按照成绩从低到高排序
  3. 得到学生姓名的列表

实现:

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());

java stream流需要判空吗 java stream流效率_List

如果看到这里还体会不到stream强大之处的同学,可以尝试一下不用stream来实现上述需求,然后对比一下代码,感觉就到位了😏。

结尾

这里仅仅是简单介绍了什么是 Stream 以及它的大概用法,主要是先对Stream有个感性的认知,下篇文章会介绍Stream的详细用法。