您的位置:首页 > 编程语言 > Java开发

JDK1.8新特性

2020-05-03 07:19 1286 查看

官网: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表达式实现接口内部类,方法体不会创建独立的作用域,因此不能创建封闭装用于已经声明的变量。并且thissuper这些关键字都是封闭作用域的。这与匿名内部类有所不同

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java