java——学习并推荐java8
学习并推荐java8
- 为什么要学习java8
- 我推荐使用lambda
Java 8的核心新特性:Lambda(匿名函数)、流、默认方法。
Java 8于2019年1月停止「免费维护」,java的生态已经发生翻天覆地的变化,应该努力拥抱变化,才能避免被时代淘汰。
为什么要学习java8
-
Java 8所做的改变,在许多方面比Java历史上任何一次改变都深远。这些改变会让你编起程来更容易,代码更简洁。
-
Java 8提供了一个新的API(称为“流”,Stream),它支持许多处理数据的并行操作。
-
Java 8中把函数视为值的一种新形式(方法和Lambda作为一等公民)。Java8之前的程序可操作两大类值:基本类型(int double等)、对象(更严格地说是对象的引用)。编程语言的整个目的就在于操作值,要是按照历史上编程语言的传统,这些值因此被称为一等值(或一等公民,这个术语是从20世纪60年代美国民权运动中借用来的)。编程语言中的其他结构也许有助于我们表示值的结构,但在程序执行期间不能传递,因而是二等公民。前面所说的值是Java中的一等公民,但其他很多Java概念(如方法和类等)则是二等公民。用方法来定义类很不错,类还可以实例化来产生值,但方法和类本身都不是值。但人们发现,在运行时传递方法能将方法变成一等公民,这在编程中非常有用,因此Java 8的设计者把这个功能加入到了Java中。Java 8允许“把代码传递给方法”,这种方式简洁地表达了行为参数化。比方说,你想要写两个只有几行代码不同的方法,那现在你只需要把不同的那部分代码作为参数传递进去就可以了。采用这种编程技巧,代码会更短、更清晰,也比常用的复制粘贴更不容易出错。虽然Java 8之前可以用匿名类实现行为参数化,但Java 8代码更加简洁、可读性更好。Java 8里面将代码传递给方法的功能(同时也能够返回代码并将其包含在数据结构中)还让我们能够使用一整套新技巧,通常称为函数式编程。这种被函数式编程界称为函数的代码,可以被来回传递并加以组合,以产生强大的编程语汇。
-
Java 8中加入默认方法。如在Java 8之前,List并没有stream或parallelStream方法,它实现的Collection接口也没有。最简单的解决方案就是让Java 8的设计者把stream方法加入Collection接口,并加入ArrayList类的实现。但有很多的替代集合框架都用Collection API实现了接口。但给Collection接口加入一个新方法,意味着所有的实体类都必须为其提供一个实现,否则代码就不能编译。java8中,若实现类未对接口中的方法签名提供实现,那么缺失的方法主体由接口提供了(因此就有了默认实现),而不是由实现类提供,从而不会破坏现有的代码。
-
Java 8对硬件也有影响。平常我们用的CPU都是多核的(可能有四个CPU内核,甚至更多)。但是,绝大多数现有的Java程序都只使用其中一个内核,其他三个都闲着。在Java 8之前,我们必须利用线程才能使用多个内核。问题是,线程用起来很难,也容易出现错误。从Java的演变路径来看,它一直致力于让并发编程更容易、出错更少。Java 1.0里有线程和锁,甚至有一个内存模型——这是当时的最佳做法。Java 5添加了工业级的构建模块,如线程池和并发集合。Java 7添加了分支/合并(fork/join)框架,使得并行变得更实用,但仍然很困难。在大数据时代,程序员越来越多地要处理所谓的大数据(数百万兆甚至更多字节的数据集),并希望利用多核计算机或计算集群来有效地处理。java8的并行流顺应时代潮流。
-
在Java 8里有一个Optional类,可以帮助你避免出现NullPointer异常。它是一个容器对象,可以包含,也可以不包含一个值。Optional中有方法来明确处理值不存在的情况,这样就可以避免NullPointer异常了。
我推荐使用lambda
很多人不喜欢用lambda表达式,他们认为lambda仅仅是语法糖,造成代码不容易维护、不容易debug、一旦报错很难从lambda的一连串的链式操作中定位等问题。这其实是没有正确的使用lambda造成的。我推荐使用lambda的原因如下:
-
语法更易读,更简洁的代码;
-
并行流提高效率,解决高并发更难的问题;
-
不能认为lambda仅仅是语法糖。 为什么不说java是二进制指令的语法糖?
-
lambda也容易debug。 不会可以百度查。
-
lambda表达式最好多行写,一个操作符占一行。 若多个操作写在同一行,报错后仅根据报错的行号不好定位问题。