jdk8新特性概述

1.概述
1.1 用行为参数化把代码传递给方法
Java 8中增加的另一个编程概念是通过API来传递代码的能力。
1.2 函数式编程
编程语言的函数通常是指方法,尤其是静态方法;Java 8中新增了函数——值的一种新形式。
A.Java 8的第一个新功能是方法引用,Java 8的方法引用::语法;
B.Lambda——匿名函数。
1.3 流
1.4 默认方法
Java 8在接口声明中使用新的default关键字来表示默认方法。
1.5 其它
A.通过使用更多的描述性数据类型来避免null
Optional<T>类,可以避免出现NullPointer异常。它是一个容器对象,可以包含,也可以不包含一个值。 Optional<T>中有方法来明确处理值不存在的情况,这样就可以避免NullPointer异常了。换句话说,它使用类型系统 , 允许你表明我们知道一个变量可能会没有值 。
B.(结构)模式匹配
2.行为参数化
行为参数化就是可以帮助你处理频繁变更的需求的一种软件开发模式。
行为参数化是一个很有用的模式,它能够轻松地适应不断变化的需求。这种模式可以把一个行为(一段代码)封装起来,并通过传递和使用创建的行为将方法的行为参数化。这种做法类似于策略设计模式。

3.Lambda表达式
3.1 概念
可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它
有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。
A.Lambda表达式有三个部分:
◆参数列表;
◆箭头——箭头->把参数列表与Lambda主体分隔开;
◆Lambda主体
B.语法:
(parameters) -> expression或(parameters) -> { statements; }
3.2 使用场景
A.函数式接口
函数式接口就是只定义一个抽象方法的接口。
接口可以拥有默认方法(即在类没有对方法进行实现时,其主体为方法提供默认实现的方法)。哪怕有很多默认方法,只要接口只定义了一个抽象方法,它就仍然是一个函数式接口。
Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现, 并把整个表达式作为函数式接口的实例(具体说来,是函数式接口一个 具体实现的实例)。
B.函数描述符
函数式接口的抽象方法的签名基本上就是Lambda表达式的签名。我们将这种抽象方法叫作
函数描述符。
3.3 使用函数式接口
A.Predicate
java.util.function.Predicate<T>接口定义了一个名叫test的抽象方法,它接受泛型T对象,并返回一个boolean。需要表示一个涉及类型T的布尔表达式时,就可以使用这个接口。
B.Consumer
java.util.function.Consumer<T>定义了一个名叫accept的抽象方法,它接受泛型T的对象,没有返回(void)。需要访问类型T的对象,并对其执行某些操作,就可以使用这个接口。
C.Function
java.util.function.Function<T, R>接口定义了一个叫作apply的方法,它接受一个泛型T的对象,并返回一个泛型R的对象。需要定义一个Lambda,将输入对象的信息映射到输出,就可以使用这个接口。
D. 原始类型特化
Java 8为我们前面所说的函数式接口带来了一个专门的版本,以便在输入和输出都是原始类
型时避免自动装箱的操作。一般来说,针对专门的输入参数类型的函数式接口的名称都要加上对应的原始类型前缀。

注意:任何函数式接口都不允许抛出受检异常(checked exception)。如果你需要Lambda表达式来抛出异常,有两种办法:定义一个自己的函数式接口,并声明受检异常,或者Lambda包在一个try/catch块中。
3.4 类型检查、类型推断以及限制
A.类型检查
Lambda的类型是从使用Lambda的上下文推断出来的。上下文中Lambda表达式需要的类型称为目标类型。
B.类型推断
Java编译器会从上下文(目标类型)推断出用什么函数式接口来配合Lambda表达式,这意味着它也可以推断出适合Lambda的签名,因为函数描述符可以通过目标类型来得到。编译器可以了解Lambda表达式的参数类型,这样就可以在Lambda语法中省去标注参数类型。
C.使用局部变量
Lambda可以没有限制地捕获(也就是在其主体中引用)实例变量和静态变量。但局部变量必须显式声明为final,或事实上是final。换句话说, Lambda表达式只能捕获指派给它们的局部变量一次。(注:捕获实例变量可以被看作捕获最终局部变量this。)
3.5 方法引用
方法引用让你可以重复使用现有的方法定义,并像Lambda一样传递它们。
方法引用就是让你根据已有的方法实现来创建Lambda表达式。显式地指明方法的名称,你的代码的可读性会更好。当你需要使用方法引时,目标引用放在分隔符::前 ,方法的名称放在后面。
A.如何构建方法引用
(1) 指向静态方法的方法引用(例如Integer的parseInt方法,写作Integer::parseInt);
(2) 指向任意类型实例方法的方法引用( 例 如 String 的 length 方 法 , 写作String::length);
(3) 指向现有对象的实例方法的方法引用。

B.构造函数引用
对于一个现有构造函数,你可以利用它的名称和关键字new来创建它的一个引用ClassName::new。它的功能与指向静态方法的引用类似。
3.6 复合 Lambda 表达式的有用方法
许多函数式接口,如用于传递Lambda表达式的Comparator、Function和Predicate都提供了允许进行复合的方法。在实践中,这意味着你可以把多个简单的Lambda复合成复杂的表达式。
A.谓词复合
谓词接口包括三个方法: negate、 and和or;
B.函数复合
可以把Function接口所代表的Lambda表达式复合起来。 Function接口为此配了andThen和compose两个默认方法,它们都会返回Function的一个实例。
◆andThen方法返回一个函数,先对输入应用一个给定函数,再对输出应用另一个函数;
◆compose方法,先把给定的函数用作compose的参数里面给的那个函数,然后再把函数本身用于结果。
4.代码


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值