Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的日期 API,新的Stream API 等。
在Java SE 8中,添加了新类,并且增强了现有类以利用lambda表达式和Stream 。 您可以在以下包中找到大多数这些新类和增强类:
java.util
: 除了java.lang.invoke
包以外的现有的包, 它将 Java Collections Framework 与streams 集成,并提供streams的常规实用功能.java.util.function
: 一个新包,提供通用的功能接口,为 lambda 表达式和方法引用 提供目标类型 .java.util.stream
: 一个新包,为stream和聚合操作提供接口和类
现有类的许多新增功能都利用了流。也添加许多函数接口( functional interfaces),这样方便使用lambda表达式或方法引用来调用它们。
新包:
java.util.function
java.util.stream
修改的包:
这里列出了诸如 Boolean
, Integer
, 其他基本类型的对象包装类 (参见Autoboxing 和 Unboxing) ,因为它们已经被增强,更加适合方法引用。例如, 你可以使用方法 Integer.sum
作为方法引用, 如下所示,显示将集合中的整数相加:
Integer[] intArray = {1, 2, 3, 4, 5, 6, 7, 8 };
List<Integer> listOfIntegers =
new ArrayList<>(Arrays.asList(intArray));
System.out.println("Sum of integers: " +
listOfIntegers
.stream()
.reduce(Integer::sum).get());
Note : 你也可以使用
IntStream.sum
将集合中的整数相加。
#新特性
Java8 新增了非常多的特性,我们主要讨论以下几个后台开发常用的特性:
-
Lambda 表达式 − Lambda允许把函数作为一个方法的参数。允许更简洁的表达单接口方法的实例。
-
方法引用 − 方法引用为已经具有名称的方法提供易于阅读的lambda表达式。。
-
默认方法 − 默认方法允许在库的接口中添加一个default的实现方法,并确保与为这些接口的旧版本编写的代码的二进制兼容性。
-
Stream API −新的java.util.stream包中的类提供了一个Stream API,以支持对元素流的功能样式操作。 Stream API集成到Collections API中,可以对集合进行批量操作,例如顺序或并行map-reduce转换。
-
Date Time API − 一组新的包,提供全面的日期时间模型。
-
Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
更多的新特性可以参阅官网:What’s New in JDK 8
#为什么需要使用Java8
1996 年 1 月,Java 1.0 发布,此后计算机编程领域发生了翻天覆地的变化。商业发展需要 更复杂的应用,大多数程序都跑在功能强大的多核 CPU 的机器上。带有高效运行时编译 器的 Java 虚拟机(JVM)的出现,使程序员将更多精力放在编写干净、易于维护的代码 上,而不是思考如何将每一个 CPU 时钟周期、每字节内存物尽其用。
多核 CPU 的兴起成为了不容回避的事实。涉及锁的编程算法不但容易出错,而且耗费时 间。人们开发了 java.util.concurrent 包和很多第三方类库,试图将并发抽象化,帮助程 序员写出在多核 CPU 上运行良好的程序。很可惜,到目前为止,我们的成果还远远不够。
开发类库的程序员使用 Java 时,发现抽象级别还不够。处理大型数据集合就是个很好的例 子,面对大型数据集合,Java 还欠缺高效的并行操作。开发者能够使用 Java 8 编写复杂的 集合处理算法,只需要简单修改一个方法,就能让代码在多核 CPU 上高效运行。为了编写 这类处理批量数据的并行类库,需要在语言层面上修改现有的 Java:增加 Lambda 表达式。
当然,这样做是有代价的,程序员必须学习如何编写和阅读使用 Lambda 表达式的代码, 但是,这不是一桩赔本的买卖。与手写一大段复杂、线程安全的代码相比,学习一点新语 法和一些新习惯容易很多。开发企业级应用时,好的类库和框架极大地降低了开发时间和 成本,也为开发易用且高效的类库扫清了障碍。
对于习惯了面向对象编程的开发者来说,抽象的概念并不陌生。面向对象编程是对数据进 行抽象,而函数式编程是对行为进行抽象。现实世界中,数据和行为并存,程序也是如 此,因此这两种编程方式我们都得学。
这种新的抽象方式还有其他好处。不是所有人都在编写性能优先的代码,对于这些人来 说,函数式编程带来的好处尤为明显。程序员能编写出更容易阅读的代码——这种代码更 多地表达了业务逻辑的意图,而不是它的实现机制。易读的代码也易于维护、更可靠、更不容易出错。
在写回调函数和事件处理程序时,程序员不必再纠缠于匿名内部类的冗繁和可读性,函数 式编程让事件处理系统变得更加简单。能将函数方便地传递也让编写惰性代码变得容易, 惰性代码在真正需要时才初始化变量的值。
Java 8 还让集合类可以拥有一些额外的方法:default 方法。程序员在维护自己的类库时, 可以使用这些方法。
总而言之,Java 已经不是祖辈们当年使用的 Java 了,嗯, 这不是件坏事。
(摘抄自【Java 8 函数式编程】)