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

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

c2f2601e14b622e2e8300163798dd4d0.png

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

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

a80d6df1d119f5843df802a49face40c.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560138.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fabric go sdk 依赖的安装_从这些角度看 Go 是一门很棒的语言

Go 当前引起了很多关注。让我们看一下 Go 好的部分。我最近用 Go 写了一个 SSH 服务器[1]&#xff0c;在其中启动容器。该项目已经发展到很大规模&#xff0c;并且我向 Go 发起了 PR[2]&#xff0c;以修复我发现的错误。在积累了比 “Hello world&#xff01;” 更多的经验之后…

css div里引用em字体会变斜体_CSS文字加粗斜体[解决代码]

CSS如何给文字加粗&#xff0c;这是小白常见的问题&#xff0c;今天俺跟大家总结分享。标签解决办法一般老的浏览器可能会使用类似或来加粗文字用来设置斜体&#xff0c;例如以下代码&#xff1a;加粗字体加粗字体斜体但是此办法语义化不是很好&#xff0c;设置字体加粗推荐使用…

程序win10_win10该文件没有与之关联的程序来执行操作

当初我遇到这个问题的时候&#xff0c;也是一脸懵&#xff01;在度娘那里尝试了许多种方法&#xff0c;都没有得到解决&#xff01;那些方法我就不一一介绍了&#xff0c;百度一大堆&#xff01;下面就来分享一下我解决的办法&#xff01;1.打开默认程序2.找到设置程序访问和计…

node工程默认url_node 爬虫入门实例,简单易懂

前言本文介绍一个 koa 的爬虫项目&#xff0c;受众对象为初学前端不久的小伙伴&#xff0c;通过这个项目能对 node 爬虫有一个简单的认识&#xff0c;也能自己动手写一些简单的爬虫。项目地址&#xff1a;Fe-Icy/firm-spider​github.com启动 koa 服务Koa (koajs) -- 基于 Node…

xshell6 不更新无法使用_世纪金花商联卡无法正常使用 客服:因门店面临改造,涉及品牌、规则每天都在更新...

有效期10年、无消费限制的世纪金花商联卡在半年前开始无法正常使用&#xff0c;11月22日&#xff0c;世纪金花赛高店内200多个零售品牌&#xff0c;只有一个品牌可以无金额限制地正常使用商联卡&#xff0c;世纪金花各门店每日可使用的品牌数量、规则都在变化&#xff0c;什么时…

runtime无法执行grep_如何使管道使用Runtime.exec()?

慕运维8079593我在Linux中遇到了一个类似的问题&#xff0c;只不过是“ps-ef_grep找进程”。至少使用“ls”可以替换与语言无关(尽管速度较慢)的Java。例如&#xff1a;File f new File("C:\\");String[] files f.listFiles(new File("/home/tihamer"));…

linux ls 中文乱码_每天一个linux命令:Linux文件类型与扩展名

Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念。我们通过一般应用程序而创建的比如file.txt、file.tar.gz &#xff0c;这些文件虽然要用不同的程序来打开&#xff0c;但放在Linux文件类型中衡量的话&#xff0c;大多是常规文件&#xff08;也被称为普通文件&…

linux中cooy命令_Linux:CentOS 7中常用的基础命令

对于学习Linux系统来说&#xff0c;命令是必须熟练掌握的第一个部分。Linux系统中的命令有600多个&#xff0c;但常用的基础命令并不多。虽然不同版本的Linux系统的命令稍有不同&#xff0c;但命令的语法与使用方法基本相同&#xff0c;因此读者只要掌握了CentOS 7中常用的基础…

730阵列卡支持多大硬盘_3分钟告诉你:OPPO Reno普通版和旗舰版的差距到底有多大...

昨天OPPO正式发布了Reno系列手机&#xff1a;分为标准版和旗舰版两款。宣传普通版的售价和旗舰版的卖点是手机厂商一贯的传统。为了搞清楚普通版和旗舰版的差距到底有多大&#xff0c;今天我和大家一起扒一扒这两款手机之间的区别到底有多大&#xff0c;供大家在选机时做一个参…

查看list的形状_用Wordcloud生成指定形状的词云图

wordcloud是Python扩展库中一种将词语用图片表达出来的一种形式&#xff0c;通过词云生成的图片&#xff0c;我们可以更加直观的看出某篇文章的故事梗概。首先贴出一张词云图(以哈利波特小说为例)&#xff1a;在生成词云图之前&#xff0c;首先要做一些准备工作1.安装结巴分词库…

oc引导win方法_[OC更新]机械革命8代、9代标压稳定版更新

加关注这种话银家怎么好意思说出口嘛更新机型机械革命Z2G机械革命Z2AIRG机械革命X3(9th ver)机械革命umi air(1080p ver)机械革命X9TI机械革命X8TI-R机械革命X8TI-G机械革命Z2机械革命Z2AIR机械革命X8TI机械革命X8TI PLUS机械革命X3(8th ver)机械革命S1PLUS(8750H)机械革命X2更…

有机晶体数据库_Cambridge Structural Database 2017 晶体结构分析软件分享

文 / 利刃君微信ID / ziyuanliren666全文共2024字&#xff0c;推荐阅读时间6分钟。剑桥结构数据库系统(The Cambridge Structural Database System&#xff0c;简写为CSDS)是基于X光和中子衍射实验唯一的小分子及金属有机分子晶体的结构数据库&#xff0c;收录了全世界范围内所…

win ftp 指定的密码无效。请键入新密码。_重设OS X (macOS)系统帐户密码的5种方法...

为了保护自己的隐私安全&#xff0c;不少 Mac 用户都会选择给自己的设备设置密码&#xff0c;但是时不时的会出现忘掉密码的情况。分享找回&#xff08;重设&#xff09;OS X &#xff08;macOS&#xff09;系统账号密码的5种方法。如果你忘记了 OS X &#xff08;macOS&#x…

word2vec应用场景_介绍Word2Vec和Glove这两种最流行的词嵌入方法背后的直觉

NLP的首要问题就是寻求恰当的文本表示方法。因为&#xff0c;良好的文本表示形式&#xff0c;是后续进一步处理的基础。近年来&#xff0c;词嵌入方法越来越流行&#xff0c;在各种各样的NLP任务中得到了广泛的应用。简单而言&#xff0c;词嵌入是通过无监督方式学习单词的向量…

pythonflask框架_Flask框架

一、Web前端与后端(PythonWeb)1.Web前端&#xff1a;网页&#xff0c;包含HTML&#xff0c;CSS&#xff0c;JS。静态网页&#xff1a;不能与服务器交互的网页动态网页&#xff1a;能够与服务器交互的网页2.Web后端&#xff1a;、Flask&#xff0c;Django、Ajax技术二、服务器1.…

滑动翻页效果_Flutter实现3D效果,一个字,炫!

老孟的博客地址&#xff1a;http://laomengit.com/Flutter 中3D效果是通过Transform组件实现的&#xff0c;没有变换效果的实现&#xff1a;class TransformDemo extends StatelessWidget {overrideWidget build(BuildContext context) {return Scaffold( appBar: AppBar(…

overleaf 插入图片_latex中插入图片

latex排版之插入图片&#xff1a;在排版图片之前&#xff0c;个人认为不管用不用到&#xff0c;引入下面两个包&#xff1a;\usepackage{graphicx}\usepackage{subfigure}(1)插入单个图片&#xff0c;图片格式为png\begin{figure}[h]\centering\includegraphics[width4cm,heigh…

debian命令乱码_Debian 9.5 解决中文显示乱码

一.首先检查LOCALE情况说明&#xff1a;DEBIAN因为基于GNU所以&#xff0c;对不同地域进行了不同的包支持&#xff0c;以LOCALE形式存在。1、启动终端#apt-get install locales2、重新配置LOCALE#dpkg-reconfigure locales在界面中我勾选的是“en_US.UTF-8”和“zh_CN.UTF-8”。…

ssh 连接mysql_mysql命令行客户端如何通过ssh服务器连接数据库啊?

ssh到跳板机然后用 mysql 连接利用ssh开启一个隧道我这里的MySQL服务器是192.168.41.83, 我要在192.168.41.72连接首先在192.168.41.72执行命令开启隧道[rootmysql-test-72 ~]# ssh -NPf -o StrictHostKeyCheckingno root192.168.41.83 -L 3305:127.0.0.1:3306root192.168.41.8…

mysql 创建 数据库失败_MySQL创建数据库失败

如果使用root账号登录到数据库create database时提错错误&#xff1a;MySQL: 1006 - Can‘t create database ‘***‘ (errno: 13)或MySQL: 1006 - Can‘t create database ‘***‘ (errno: 28)&#xff0c;一般是mysql用户没有目录权限的问题。先用Linux指令 : ls -ld 查看d…