为什么要学习Java8?

为什么要学习Java8?

1.0 java 8 简介

​ Java 8提供了一个新的API(称为“流”,Stream),它支持许多处理数据的并行操作,跟数据库查询语言中的思路类似——用更高级的方式表达想要的东西,而由“实现”(在这里是Streams库)来选择最佳低级执行机制。这样就可以避免用synchronized编写代码,这一代码不仅容易出错,而且在多核CPU上执行所需的成本也比你想象的要高。从有点修正主义的角度来看,在Java 8中加入Streams可以看作把另外两项扩充加入Java 8的直接原因:把代码传递给方法的简洁方式(方法引用、Lambda)和接口中的默认方法。如果仅仅“把代码传递给方法”看作Streams的一个结果,那就低估了它在Java 8中的应用范围。它提供了一种新的方式,这种方式简洁地表达了行为参数化Java 8里面将代码传递给方法的功能(同时也能够返回代码并将其包含在数据结构中)还让我们能够使用一整套新技巧,通常称为函数式编程。一言以蔽之,这种被函数式编程界称为函数的代码,可以被来回传递并加以组合,以产生强大的编程语汇。

1.1节讨论了Java的演变过程和概念,指出Java以前缺乏以简易方式利用多核并行的能力。

1.1.1流处理

流是一系列的数据项,一次只生成一项。程序可以从输入流中一个一个读取数据项,然后以同样的方式将数据项写入输出流。一个程序的输出流很可能是另一个程序的输入流。

例如::Unix的cat命令会把两个文件连接起来创建一个流,tr会转换流中的字符,sort会对流中的行进行排序,而tail -3则给出流的最后三行。Unix命令行允许这些程序通过管道(|)连接在一起,比如cat file1 file2 | tr “[A-Z]” “[a-z]” | sort | tail -3

基于这一思想,Java 8在java.util.stream中添加了一个Stream API;Stream就是一系列T类型的项目。现在可以把它看成一种比较花哨的迭代器。Stream API的很多方法可以链接起来形成一个复杂的流水线,就像先前例子里面链接起来的Unix命令一样。推动这种做法的关键在于,现在你可以在一个更高的抽象层次上写Java 8程序了:思路变成了把这样的流变成那样的流(就像写数据库查询语句时的那种思路),而不是一次只处理一个项目。另一个好处是,Java 8可以透明地把输入的不相关部分拿到几个CPU内核上去分别执行你的Stream操作流水线——这是几乎免费的并行,用不着去费劲搞Thread了。

1.1.2用行为参数化把代码传递给方法:

Java 8增加了把方法(你的代码)作为参数传递给另一个方法的能力,把这一概念称为行为参数化。

1.1.3 并行与共享的可变数据

流的处理能力“几乎免费并行”,需要舍弃什么呢?

你的方法必须能够同时对不同的输入**安全地执行,**这就意味着,写代码时不能访问共享可变数据。这些函数称作“纯函数”或“无副作用函数”或“无状态函数”。

Java8的流实现并行比Java现有的线程API更容易,因此,尽管可以用synchronized来打破“不能有共享可变数据”这一规则,但这相当与是在和整个体系作对,因此它所围绕这一规则做出的优化都失去意义了。在多核处理器之间使用synchronized,其代价往往比你预期要大的多,因为同步迫使代码按顺序执行,而这与并行处理的宗旨相悖。

没有共享的可变数据,将方法和函数即代码传递给其他方法的能力,是函数式编程范式的基石。于此相反,在命令式编程范式中,你写的程序则是一系列改变状态的指令。“不能有共享的可能变数据”的要求意味着,一个方法是可以通过它将参数值转换为结果的方式完全描述;换句话说,它的行为就像一个数学函数,没有可见的副作用。

1.1.4 Java需要演变

Java 8中的主要变化反映了它开始远离常侧重改变现有值的经典面向对象思想,而向函数式编程领域转变,在大面上考虑做什么被认为是头等大事,并和如何实现区分开来。总结下来一句话:语言需要不断的改进以跟进硬件的更新或满足程序员的期待。要坚持下去,Java必须通过增加新功能来改进,而且只有新功能被人使用,变化才有意义。所以Java8,就是在保护Java 程序员的职业生涯。

1.2节介绍了为什么把代码传递给方法在Java 8里是如此强大的一个新的编程语汇。

Java中的函数:编程语言中的函数一般指方法,尤其是静态方法;这是在数据函数也就是没有副作用的函数之外的新含义。

编程语言整个目的就在于操作值,这些值被称为一等值(或一等公民);其他结构也许有助于表示值的结构,但在程序执行期间不能传递,因此是二等公民。

1.2.1 方法和Lambda作为一等公民

Scala和Groovy等语言的实践已经证明,让方法等概念作为一等值可以扩充程序员的工具库,从而让编程变得更容易。因此,Java 8的设计者决定允许方法作为值,让编程更轻松。此外,让方法作为值也构成了其他若干Java 8功能(如Stream)的基础。

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

Java 8的方法引用::语法(即“把这个方法作为值”)将其传给listFiles方法;请注意,我们也开始用函数代表方法了。一个好处是,代码现在读起来更接近问题的陈述了。方法不再是二等值了。与用对象引用传递对象类似(对象引用是用new创建的),在Java 8里写下File::isHidden的时候,你就创建了一个方法引用,你同样可以传递它。

Java 8还体现了更广义的将函数作为值的思想,包括Lambda①(或匿名函数)。比如,可以写(int x) -> x + 1,表示“调用时给定参数x,就返回x + 1值的函数”。

1.3节对Streams做了同样的介绍:Streams是Java 8表示有序数据,并能灵活地表示这些数据是否可以并行处理的新方式。

和Collection API相比,Stream API处理数据的方式非常不同。用for-each循环一个个去迭代元素,然后再处理元素。这种数据迭代的方法称为外部迭代。相反,有了Stream API,根本用不着操心循环的事情。数据处理完全是在库内部进行的。把这种思想叫作内部迭代

1.4节解释了如何利用Java 8中的默认方法功能让接口和库的演变更顺畅、编译更少。
1.5节展望了在Java和其他共用JVM的语言中进行函数式编程的思想。

将方法和Lambda作为一等值,以及在没有可变共享状态时,函数或方法可以有效、安全地并行执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苹水相峰

你的打赏是对我最大的肯定

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值