1.基础知识-为什么要关心Java8

文章是个人阅读《Java8实战》过程中的重点摘抄,可能晦涩,没有示例代码,后续会补充总结完善。


本章内容

  • Java怎么又变了
  • 日新月异的计算应用背景:多核和处理大型数据集(大数据)
  • 改进的压力:函数式比命令式更适应新的体系架构
  • Java 8的核心新特性: Lambda(匿名函数)、流、默认方法

核心问题

1.为什么会出现新的特性(新特性的出现必然是为了解决当下或以前存在的问题)
2.新特性有哪些(方法引用、Lambda、Stream、默认方法)
3.新特性之间的内在联系是什么(流 > 方法引用 > Lambda > 默认方法)
4.新特性的概念是什么

概述

java8所作出的改变,在许多方便比Java历史上的任何一次改变都深远。本章主要从宏观角度探讨了语言为什么会演变,后面的小节会介绍java8的核心特性,以及函数式编程思想。(简化使用,并充分利用计算机性能)


1.1 java怎么还在变

java演变的过程和概念,指出java以前缺乏以简易的方式利用多核并行的能力

java8对于程序员的好处是提供了更多的编程工具(api)和概念,能以更快、更简洁、更易维护的方式解决新的或现有的编程问题。虽然这些概念对于java是新的,但是其他语言已经证明了它们的强大。

我们会突出并探讨三个这样的编程概念背后的思想:流处理、用行为参数化把代码传递给方法、并行与可变的共享数据。

1.1.1 (数据/集合的)流处理

流是一系列数据项,一次只生成一项。以unix中的命令为示例(示例略)阐述了流的思想,基于这一思想,java8中添加了streamAPI。在api中,很多方法可以链接起来形成一个复杂的流水线,就像unix命令一样,也可以把这中处理看作是一种迭代器。

推动流处理的关键在于,可以在一个更高的抽象层次上编写java代码,思路在于把这样的流变成那样的流,而不是一次只处理一个项。而流处理的另一个好处是简化了并行处理。

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

通过一个对发票排序需求的示例(示例略),阐述了java8之前解决此问题的诟病:可以定义排序方法,但是无法将排序方法作为参数传递给另一个方法,只能通过匿名内部类的方式进行处理。

Collections.sort(new ArrayList<Integer>(), new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return 0;
    }
});

这样的处理方式不但啰,而且无法重复使用行为。java8通过行为参数化的方式,增加了让方法传递给应一个方法的能力。streamAPI就是构建在通过传递代码使操作行为参数化的思想之上的。

1.1.3 并行与共享的可变数据

对于流的“几乎免费的并行”这样说法,是有前提的。前提就是代码的副本可以独立的工作,不对共享变量进行操作。【此处涉及多线程相关的知识】

此处还提出了函数式编程范式的基石:没有共享的可变数据,将代码传递给其他方法的能力。


1.2 java中的函数

为什么把代码(方法或函数)传递给方法在java8里是如此强大

编程语言的整个目的在于操纵值,因此值作为编程语言中的一等公民。而编程语言中的其他结构,例如方法和类,是用来帮助我们表示值的,在程序的执行旗舰它们是不能传递的,因为是二等公民。用方法来定义类,然后实例化类来产生值,但是方法和类本身不是值。但是将方法和类作为值可以让编程更容易。

1.2.1 方法引用和Lambda表达式

让方法作为值构成了其他java8功能的基础,也是要介绍的第一个java8新功能。完成这个功能的语法叫做方法引用,此外java8还体现了更广义的将函数作为值的思想,即Lambda表达式(匿名函数/匿名方法)。

1.2.2 从传递方法到Lambda表达式

把方法作为参数传递很有用,但是只用一两次的短方法写一堆就会让代码的可读性下降,Lambda表达式就是为了解决这个问题而出现的。


1.3 stream

java8有序数据的表示:stream

为了更好的利用并行,java8有一套新的类集合api:stream。

Collection和Stream处理数据的方式截然不同。用集合处理循环需要使用for-each迭代元素,然后在处理元素,我们把这种数据迭代称为外部迭代。用流处理循环不用关心迭代的问题,迭代是在类库的内部进行的,我们称之为内部迭代。另一个就是处理大量数据且提高处理的效率的情况,集合只能通过多线程代码来利用并行(ThreadAPI),这并非易事。

SteamAPI主要解决了两个问题:集合处理数据的复杂性和处理过程中多线程的非易用性。二者之间在处理数据的行为是类似的,但是Collection主要是存储和访问数据,而Stream主要是用于数据的计算和处理。


1.4 默认方法

利用java8的默认方法,让接口和库的演变更顺畅、编译更少

默认接口的出现是为了支持类库的设计,让类库的接口更容易改进。这解决了如何改变已经发布的接口而不破坏已有的实现的问题,这就给接口设计者提供了一个在不破坏现有代码的情况下,扩充接口的方式。


1.5 来自函数式编程的其他好思想

函数式编程思想、(结构)模式匹配


1.6 小结

  • 请记住语言生态系统的思想,以及语言面临的“要么改变,要么衰亡”的压力。虽然Java可能现在非常有活力,但你可以回忆一下其他曾经也有活力但未能及时改进的语言的命运,如COBOL。
  • Java 8中新增的核心内容提供了令人激动的新概念和功能,方便我们编写既有效又简洁的程序。
  • 现有的Java编程实践并不能很好地利用多核处理器。
  • 函数是一等值;记得方法如何作为函数式值来传递,还有Lambda是怎样写的。
  • Java 8中Streams的概念使得Collections的许多方面得以推广,让代码更为易读,并允许并行处理流元素。
  • 你可以在接口中使用默认方法,在实现类没有实现方法时提供方法内容。
  • 其他来自函数式编程的有趣思想,包括处理null和使用模式匹配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值