自1998年 JDK 1.0(Java 1.0) 发布以来,Java 已经受到了学生、项目经理和程序员等一大批活跃用户的欢迎。这一语言极富活力,不断被用在大大小小的项目里。从 Java 1.1(1997年) 一直到 Java 7(2011年),Java 通过增加新功能,不断得到良好的升级。Java 8 则是在2014年3月发布的。Java 8 所做的改变,在许多方面比 Java 历史上任何一次改变都深远,而且极大的提高了 Java 代码的简洁性。

1. lambda 表达式

本文通过筛选苹果的需求引入 Java 8 ,对 inventory 中的苹果按照重量进行排序。 Java 8 之前的版本:

Collections.sort(inventory, new Comparator<Apple>() {public int compare(Apple a1, Apple a2){return a1.getWeight().compareTo(a2.getWeight());}
});

Java 8 版本:

inventory.sort(comparing(Apple::getWeight));

通过对比我们不难发现,使用 Java 8 可以编写更为简洁的代码,而且代码读起来更接近问题的描述。

2. 方法引用

在 Java 8 之前类(Class)是Java中的一等公民,Java8中将方法和lambda增加为一等公民。方法和lambda作为一等公民,是Java8中方法引用的基础。除了允许(命名)函数成为一等值外,Java 8还体现了更广义的将函数作为值的思想,包括 Lambda1(或匿名函数)。

筛选一个目录中的所有隐藏文件,Java 8 之前版本:

File[] hiddenFiles = new File(“.”).listFiles(new FileFilter() {public boolean accept (File file) {return file.isHidden();}
}

Java 8 版本:

File[] hiddenFiles = new File(".").listFiles(File::isHidden);

3. 流

在Java8之前,遍历处理集合元素,你得用for-each循环一个个去迭代元素,然后再处理元素。我们把这种数据迭代的方法称为外部迭代。相反,有了Stream API,你根本用不着操心循环的事情。数据处理完全是在库内部进行的。我们把这种思想叫作内部迭代。

Java 8 中对于大数据量的集合,用Stream API(java.util.stream)解决了:集合处理时的套路和晦涩,以及难以利用多核这两个问题。

如下展示 Java 8 中使用 Stream API 并行处理数据:

import static java.util.stream.Collectors.toList;
List<Apple> heavyApples = inventory.parallelStream().filter((Apple a) -> a.getWeight() > 150) .collect(toList());

4. 默认方法

Java 8中加入默认方法主要是为了支持库设计师,让他们能够写出更容易改进的接口。同时,普通开发者也可以在接口中使用默认方法,在实现类没有实现方法时提供方法内容,进一步方便开发。

List<Apple> heavyApples1 = inventory.stream().filter((Apple a) -> a.getWeight() > 150).collect(toList());
List<Apple> heavyApples2 = inventory.parallelStream().filter((Apple a) -> a.getWeight() > 150).collect(toList());

在Java 8之前,List并没有stream或parallelStream方法,它实现 的Collection接口也没有。Java 8 给接口设计者提供了一个扩充接口的方式,而不会破坏现有的代码。Java 8在接口声明 中使用新的default关键字来表示这一点。这样就实现了改变已发布的接口而不破坏已有的实现。

总结

本章主要总结Java 8 的主要变化(Lambda表达式、方法引用、流和默认方法),为后面更进一步学习打下坚实基础。

Tips

本文同步发表在公众号,欢迎大家关注! 后续笔记欢迎关注获取第一时间更新!

java8 stream 做累加_《Java 8 in Action》Chapter 1:为什么要关心Java 8相关推荐

  1. java8 stream 做累加_Java8新特性之Stream(上)|乐字节

    上次给大家介绍了Java8新特性之方法引用,大家可以点击回顾下.接下来小乐继续给大家带来Java8新特性之Stream ,流是Java8最重要的内容,小乐准备分上下两部分介绍,今天是上部. 5.1.什 ...

  2. java8 stream 的list处理

    目录 1.List<Map>使用map中每一个字符拼接字符串 2.取出list集合对象中某一个属性,生成新的list 3.list集合的排序 ①List(Bean) ②List (Map) ...

  3. Java中快速处理集合_简洁又快速地处理集合——Java8 Stream(上)

    作者:Howie_Y,系原创投稿 主页:www.jianshu.com/u/79638e5f0743 Java 8 发布至今也已经好几年过去,如今 Java 也已经向 11 迈去,但是 Java 8 ...

  4. java sort 效率_性能对比:collections.sort vs treeSet sort vs java8 stream.sorted

    0 写在前面的话 在项目中有一个排序问题,考虑到未来需要排序的数据量可能很大,想用一个性能较好的排序算法,现在有三套解决方法:jdk提供的集合的sort方法(Collections.sort).一个可 ...

  5. java8返回单个号码_如何在单个API中支持Java 6、8、9

    java8返回单个号码 借助jOOQ 3.7,我们终于添加了对Java 8功能的正式支持. 这为许多不错的改进打开了大门,例如: 创建结果流 try (Stream<Record2<Str ...

  6. java8 stream reduce 方法用法 java stream reduce 方法使用方法

    java8 stream reduce 方法用法 java stream reduce 方法使用方法 一.背景 在使用Stream的reduce方法时,发现该方法有 3个重载方法,分别是: 一个参数. ...

  7. java netty能做什么_开发:Netty快速入门,一看就懂!

    很早以前就写过关于 Netty 的使用,最近发现还有网友在看之前写的那篇 Netty 文章,个人感觉那时候写的很粗糙,怕影响同行的阅读质量,所以决定重新写一些关于 Netty 的文章,补充以前的不足. ...

  8. Java基础学习总结(132)——Java8 Stream流操作学习总结

    传统的数据处理都是用循环来解决,而不是像搜索数据库那样有具体的搜索语句,而Java8的Stream提供了很好的方案,往往一行就搞定了,而且Stream还可以链式操作,一行代码实现多个循环的功能,代码风 ...

  9. java双层list扁平化,浅谈java8 stream flatMap流的扁平化操作

    概念: Steam 是Java8 提出的一个新概念,不是输入输出的 Stream 流,而是一种用函数式编程方式在集合类上进行复杂操作的工具.简而言之,是以内部迭代的方式处理集合数据的操作,内部迭代可以 ...

最新文章

  1. CentOS7.4 安装mongodb
  2. 界面Hello world
  3. 开发日记-20190608 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  4. 【转载】用 Pyinstaller 来打包 + 解决打包结果过大问题
  5. UI5 table display visible row count logic calculation calculate
  6. nginx的安装及简单负载均衡配置
  7. C语言练习-绘制金字塔
  8. Android:ViewPage使用教程
  9. H5通过数据流方式播放视频
  10. 5G学习笔记之NG-RAN系统架构(2)
  11. 31省市自治区农村居民消费价格指数(2010-2020年)
  12. layui标签输入框添加禁止点击标志
  13. 实体店收银系统怎么做管理和营销?
  14. chrome扩展设置代理
  15. 图形界面 I: 用于表单按钮的函数与删除界面元素 (第四章)
  16. 国科大学习资料--最优化计算方法(王晓)--期末考试试卷3
  17. 高通音频驱动录音流程(五)
  18. 台北房价窥北京未来:调控阻止不了高房价
  19. 15款JQuery图片展示效果插件
  20. JQuery库的使用

热门文章

  1. Android studio小问题解决
  2. 算法复习第五章贪心法
  3. Ray集群搭建 Python Demo
  4. 操作系统的SPOOLING技术
  5. python 根据名称获取pid_【Python学习笔记】76、常用第三方模块psutil
  6. birt什么意思中文翻译_ECTN是什么意思
  7. 计算机管理关机在哪,电脑点了关机为什么却关不了
  8. oracle获取登录名,oracle如何获取当前登录的用户名
  9. r语言 fread函数参数_R语言 第4章 初级绘图(6)
  10. android背景不填充,(Android Studio)应用程序背景图像不填充屏幕