前言

上一篇博客一文带你深入了解 Lambda 表达式和方法引用我给大家介绍了 Java8 函数式特性中的 Lambda,这篇文章我将继续讨论 stream 流的用法

声明:本文首发于博客园,作者:后青春期的Keats;地址:https://www.cnblogs.com/keatsCoder/ 转载请注明,谢谢!

Show Time

首先给大家看一段代码,让大家直观感受下 Java7 和 Java8 遍历处理集合的不同

Dish 是一个菜肴对象,calories 属性表示该菜品的卡路里值,name 则是菜品的名称。我们需要过滤出卡路里小于400、然后根据卡路里值升序、接着拿到他们的名称列表并返回

Java7

public static List<String> getLowCaloricDishesNamesInJava7(List<Dish> dishes){
List<Dish> lowCaloricDishes = new ArrayList<>();
for(Dish d: dishes){
if(d.getCalories() < 400){
lowCaloricDishes.add(d);
}
}
List<String> lowCaloricDishesName = new ArrayList<>();
Collections.sort(lowCaloricDishes, new Comparator<Dish>() {
public int compare(Dish d1, Dish d2){
return Integer.compare(d1.getCalories(), d2.getCalories());
}
});
for(Dish d: lowCaloricDishes){
lowCaloricDishesName.add(d.getName());
}
return lowCaloricDishesName;
}

Java8

public static List<String> getLowCaloricDishesNamesInJava8(List<Dish> dishes){
return dishes.stream()
.filter(d -> d.getCalories() < 400)
.sorted(comparing(Dish::getCalories))
.map(Dish::getName)
.collect(toList());
}

如果需要多核并行处理,则只需调用 dishes.parallelStream() 即可

在 Java8 之前,程序员需要通过 2次遍历 + 一次集合排序才能完成的工作,Java8 只需要一个链式调用就可以解决。这就是 stream 的强大之处

认识流

流是什么

流是 Java API 的新成员,允许程序员以声明式的方式处理集合数据,并且支持链式调用、支持并行处理。用流处理的集合数据高效且易读。

流与集合的异同

  1. 集合的主要功能是以一定的时间和空间复杂度存储和访问元素,而流主要是用于元素计算
  2. 集合中的元素可以随意添加和删除,而流不能添加和删除元素
  3. 流的元素是按需计算的,只有当用到时他才会参与计算,而集合中的元素必须提前全都准备好
  4. 流只能遍历一次,下面的代码会报错 java.lang.IllegalStateException: stream has already been operated upon or closed 流已经被消费掉
List<String> names = Arrays.asList("Java8", "Lambdas", "In", "Action");
Stream<String> s = names.stream();
s.forEach(System.out::println);
s.forEach(System.out::println);
  1. 集合采用外部迭代,流采用内部迭代。内部迭代意味着 Java 可以替你选择更优的迭代策略和并行处理。而外部迭代如果程序员想着做个更有的迭代/采用并行就相当于“下次一定”

    还在用迭代器处理集合吗?试试Stream,真香的更多相关文章

    1. Vim一直学不会?试试这个 "真香" 神器

      Vim 的使用,一直以来是一个难题 以至于国外的知名程序员问答社区 StackOverFlow 上有一个问题 How to I exit the Vim editor 获得了超过 200万次的浏览量 ...

    2. 迭代器:遍历集合元素的操作. iterator()

      package seday11; import java.util.ArrayList;import java.util.Collection;import java.util.Iterator; / ...

    3. 你只会用 StringBuilder?试试 StringJoiner,真香!

      你只会用 StringBuilder/ StringBuffer 拼接字符串? 那你就 OUT 了!! 如果需要拼接分隔符的字符串,建议使用 Java 8 中的这款拼接神器:StringJoiner, ...

    4. 联合迭代器与生成器,enumerate() 内置函数真香!

      花下猫语:Python 中很多内置函数的作用都非常大,比如说 enumerate() 和 zip(),它们使得我们在作迭代操作时极为顺手.这是一篇很多年前的 PEP,提议在 Python 2.3 版本 ...

    5. c# 迭代器 与 集合 IEnumerable.GetEnumerator 方法

      示例来源 :msdn 参考:https://msdn.microsoft.com/zh-cn/library/dscyy5s0(v=vs.110).aspx 使用匿名方法.迭代器和部分选件类创建简洁的 ...

    6. 使用Iterator迭代器循环集合

      1.Iterator迭代器用于遍历集合元素,获取迭代器可以使用. 2.Iterator提供了统一遍历集合元素的 方式 ,其提供了用于遍历集合的连个方法----- boolean  hasNext()判 ...

    7. 9102年了,你还在用for循环操作集合?

      本文首发于cdream的个人博客,点击获得更好的阅读体验! 欢迎转载,转载请注明出处. 前段时间公司书架多了一本<Java8 实战>,毕竟久闻lambda的大名,于是借来一阅.这一看,简直 ...

    8. 你还在手撕微服务?快试试 go-zero 的微服务自动生成

      0. 为什么说做好微服务很难? 要想做好微服务,我们需要理解和掌握的知识点非常多,从几个维度上来说: 基本功能层面 并发控制&限流,避免服务被突发流量击垮 服务注册与服务发现,确保能够动态侦测 ...

    9. 还在使用@Autowrired注入?不妨试试@RequiredArgsConstructor

      一.前言 小编最近在项目里看到有的同事大神用到了Lombok中的一个@RequiredArgsConstructor,带着好奇发现这个东西就是简化了一些@Autowired注解,想想如果一个Servi ...

    随机推荐

    1. python3(十一)generator

      # 只要把一个列表生成式的[]改成() L = [x * x for x in range(10)] print(L) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] g ...

    2. jetCache 基本使用

      1.pom引用 <!--jetcache缓存 lettuce--> <dependency> <groupId>com.alicp.jetcache</gro ...

    3. AQS系列(七)- 终篇:AQS总结

      前言 本文是对之前AQS系列文章的一个小结,首先看看以下几个问题: 1.ReentrantLock和ReentrantReadWriteLock的可重入特性是如何实现的? 2.哪个变量控制着锁是否被占 ...

    4. python 自动打包,发送邮件(包括附件)至多个收件人(qq邮箱,163邮箱)

      -----------------------------打包部分---------------------------------- import zipfile def zipDir(dirpat ...

    5. python的pip怎样更新包 + pip的help翻译

      1.pip下载安装 pip下载 进入https://pypi.python.org/pypi/pip,下载 .tar.gz压缩包 Linux安装pip # tar -xzvf pip-1.5.4.ta ...

    6. 给我Python几十行代码,我还你一个微信聊天助手

      前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 故事胶片 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...

    7. tf.keras的模块

            

    8. 数据挖掘入门系列教程(十点五)之DNN介绍及公式推导

      深度神经网络(DNN,Deep Neural Networks)简介 首先让我们先回想起在之前博客(数据挖掘入门系列教程(七点五)之神经网络介绍)中介绍的神经网络:为了解决M-P模型中无法处理XOR等 ...

    9. Windows系统安装最新版本RabbitMQ3.8.3及报错解决

      今天想安装下RabbitMQ写几个用例看下,发现最新的安装包有些问题,不能直接安装使用,遇到一些问题,记录一下解决办法. 下载安装包 因为RabbitMQ是Erlang编写,安装时,需要先安装Erla ...

    10. Django ORM 查询表中某列字段值

      场景: 有一个表中的某一列,你需要获取到这一列的所有值,你怎么操作? 解决办法: 有一个model为:Event 方式一: 获取内容: Event.objects.values('title') 输出 ...