java8相关特性

java8相关特性

面对日新月异的计算应用背景,多核和处理大型数据集(大数据),java需要一个新的体系架构来应对这种需求,函数式比命令式更适合搭建这个架构,于是java8通过增加Lambda(匿名函数)、流、默认方法等新特性实现对函数式编程的支持。

Java 8中的主要变化反映了它开始远离常侧重改变现有值的经典面向对象思想,而向函数式编程领域转变。

编程概念

java8提供了更多编程概念,能够以简洁、易维护的方式解决编程问题。

  • 流处理

    第一个编程概念是流处理。流处理如同流水线上的项目,尽管单个项目是顺序执行,不同加工站的运行一般是并行的。

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

    基于这一思想,Java 8在java.util.stream中添加了一个Stream API; Stream<T>就是一系列T类型的项目。由此带来的是Java 8可以透明地把输入的不相关部分拿到几个CPU内核上去分别执行Stream操作流水线。

  • 行为参数化

    第二个编程概念是行为参数化。行为参数化是指能够把一个方法(代码)作为参数传递给另一个方法。

  • 并行与共享的可变数据

    第三个编程概念来源于流处理的并行操作,这些操作必须能够同时对不同的输入安全地执行。这意味着,代码不能访问共享的可变数据。实现这些操作的函数被称为“纯函数”或“无副作用函数”或“无状态函数”。

    在多个处理器内核之间使用synchronized,其代价往往比你预期的要大得多,因为同步迫使代码按照顺序执行,而这与并行处理的宗旨相悖

没有共享的可变数据,行为参数化是我们平常所说的函数式编程范式的基石

java中的函数

Java 8中新增了函数——值的一种新形式。

编程语言的整个目的就在于操作值,这些值因此被称为一等公民。编程语言中的其他结构也许有助于表示值的结构,但在程序执行期间不能传递,因而是二等公民。在运行时传递方法能够将方法变成一等公民。

  • 方法和Lambda作为一等公民

    方法作为值,让编程更容易。此外,让方法作为值也构成了其他若干Java 8功能(如Stream)的基础。

    1. 方法引用

      方法引用可以将已经存在的函数作为值传递给另一方法。这使得代码的表意性加强,更加简洁。

      File[] hiddenFiles = new File(".").listFiles(File::isHidden);
      
    2. Lambda

      如果没有现成的方法可用,可以使用Lambda来简洁地定义一个方法。

Java 8用Stream API(java.util.stream)解决了java中的两个问题:集合处理时的套路和晦涩,以及难以利用多核。

Stream API通过内部迭代处理数据,用户只需要关心数据选择的逻辑,从而使得代码更加简洁、可读性更高。Collection在数据处理时通过外部迭代,用户杂糅了迭代的代码与数据处理的代码,使得代码不够简洁、可读性变低。

Collection主要是为了存储和访问数据,而Stream则主要用于描述对数据的计算。

默认方法

java8的默认方法解决改变已发布的接口而不破坏已有实现的问题。接口可以通过default关键字提供方法的默认实现。

其他函数式编程思想

Java从函数式编程中引入了两个核心思想:将方法和Lambda作为一等值,以及在没有可变共享状态时,函数或方法可以有效、安全地并行执行。

  • 通过使用更多的描述性数据类型来避免null

    在Java 8里有一个Optional<T>类,其中有方法来明确处理值不存在的情况,这样就可以避免NullPointer异常了。

  • 模式(结构)匹配

    对于更复杂的数据类型,模式匹配可以比if-then-else更简明地表达编程思想。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值