JDK1.8新特性
官网:https://www.oracle.com/cn/java/technologies/8-whats-new.html
https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
着重知识点:
1.函数式接口(功能接口)。
2.Java 8 允许我们给接口添加一个非抽象的方法实现,只需要使用default关键字即可,这个特征又叫扩展方法。
3.Lambda 表达式。参数 => 主体。Lambda表达返回右边表达式的结果。
4.用 :: 关键字来传递方法和构造函数。
1. 函数式接口(功能接口)
Lambda 表达式与功能接口一起使用,功能接口实际上是一种只有一个抽象方法的接口;功能接口可以包含一个同时也存在于
Object
类中的方法。功能接口的示例有java.util.concurrent.Callable
(具有单一方法call()
)和java.lang.Runnable
(具有单一方法run()
)。
函数式接口(functional interface 也叫功能性接口,其实是同一个东西)。简单来说,函数式接口是只包含一个方法的接口。比如Java标准库中的java.lang.Runnable和 java.util.Comparator都是典型的函数式接口。 java 8提供 @FunctionalInterface作为注解,这个注解是非必须的,只要接口符合函数式接口的标准(即只包含一个方法的接口),虚拟机会自动判断, 但 最好在接口上使用注解@FunctionalInterface进行声明,以免团队的其他人员错误地往接口中添加新的方法。
2. 虚拟扩展方法:接口定义default
默认方法。
接口的封装和可重用性是接口的主要优点。但接口的缺点是实现接口的类必须实现所有接口方法。有时只需要接口的部分方法,但在实现接口时必须提供所有接口方法的方法实现。虚拟扩展方法解决了这个问题。再次之前都是通过
Adapter
设计模式来处理
public interface Sqrt { double getSqrt(); // 虚拟扩展方法 default String func() { return "defaultFuc"; } // 也可以定义静态方法 static Sqrt getInstance(int i) { return new Sqrt() { @Override public double getSqrt() { return i; } }; } }
3. Lambda 表达式。参数 => 主体
官网:https://www.oracle.com/technetwork/cn/articles/java/lambda-1984522-zhs.html
Lambda
表达式是用于快速创建实现接口的匿名内部类。不同在于没有自己的作用域
Lambda 表达式的语法如下所示。
(formal parameter list) ->{ expression or statements }
lambda
表达式实现接口内部类,方法体不会创建独立的作用域,因此不能创建封闭装用于已经声明的变量。并且this
、super
这些关键字都是封闭作用域的。这与匿名内部类有所不同
4. 方法引用
文档同上
Lambda 表达式定义了一个匿名方法,其中功能接口作为目标类型。可以使用方法引用来调用具有名称的现有方法,而不是定义匿名方法。在清单 9 所示的 EmployeeSort
示例中,以下方法调用将 lambda 表达式作为方法参数。
Collections.sort(list, (x, y) -> x.getLastName().compareTo(y.getLastName())); // 可以按以下方式将 lambda 表达式替换为方法引用: Collections.sort(list, Employee::compareByLastName);
对于非静态方法,方法引用可与特定对象的实例一起使用。通过将 compareByLastName
方法非静态化,可按如下方式将方法引用与与 Employee
实例结合使用:
Employee employee=new Employee(); Collections.sort(list, employee::compareByLastName);
方法引用甚至不必是所属对象的实例方法。方法引用可以是任何任意类对象的实例方法。例如,通过方法引用,可以使用 String
类的 compareTo
方法对 String List
进行排序。
String e1 = new String("A"); String e2 = new String("B"); List<String> list = new ArrayList<String>(); list.add(e1);list.add(e2); Collections.sort(list, String::compareTo);
方法引用是 lambda 表达式的进一步简化。
构造函数引用
方法引用的作用是方法调用,而构造函数引用的作用是构造函数调用。方法引用和构造函数引用是 lambda 转换,方法引用和构造函数引用的目标类型必须是功能接口。
Lambda.java
import java.util.ArrayList; public interface Lambda { public abstract ArrayList<String> run(); }
LambdaClass.java
public class LambdaClass { public LambdaClass() {} public LambdaClass(Lambda lambda) {} }
main
public class Main { public static void main(String[] args) { // 一般方式 LambdaClass lambdaClass1 = new LambdaClass(new Lambda() { @Override public ArrayList<String> run() { return new ArrayList<>(); } }); // lambda 表达式 LambdaClass lambdaClass2 = new LambdaClass(() -> new ArrayList<>()); // 构造函数引用 LambdaClass lambdaClass = new LambdaClass(ArrayList::new); } }
- jdk1.8新特性
- jdk 1.8 新特性之——stream Collectors
- java入门篇 (33) jdk1.8 新特性
- 再次出发:JDK1.8中Map新特性
- Java面试经验——JDK1.8特性
- [转]JDK1.7和JDK1.8的新特性
- JDK1.8的新特性——注解Annotation更多场景的使用
- JDK1.8的新特性----default关键字
- jdk1.8新特性学习(六)新增的时间框架类结构关系图,类转换关系图,时间格式化关系图
- JDK各个版本的新特性jdk1.5-jdk1.8(一)理论篇
- 菜鸟记录之JDK1.8十大新特性
- jdk1.5 jdk1.6 jdk1.7 jdk1.8 特性
- JDK1.8新特性学习之Lambda表达式(一)
- JDK1.8新特性学习之接口中的静态方法与默认方法(三)
- JDK1.8新特性 Lambda表达式
- jdk1.8新特性 分组统计及格式化
- Java基础--JDK1.8新特性-Lamda
- JDK1.8新特性---λ(Lambda )表达式
- Java JDK1.8新特性
- JDK1.8新特性