JDK1.8 的新特性

  1. Java8 允许我们给接口添加一个非抽象的方法实现,只需要使用 default 关键字即可,这个特征又叫做扩展方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    class test implements aa{
    @Override
    public String change(String str) {
    return str;
    }

    public static void main(String[] args) {
    test test = new test();
    String append = test.append("123");
    System.out.println(append);//123abc


    }


    }
    interface aa{
    abstract String change(String str);

    default String append(String str){
    return str+"abc";
    }
    }
  2. lambda 表达式,是一种简洁的语法,实际上是一个匿名函数。所有的 lambda 表达式都是用新的 lambda 运算符 -> ,可以叫他 “转到” 或者 “成为”。运算符表达式分为两部分,左边指定输入参数,右边是 lambda 的主体。lambda 表达式返回右边表达式的结果。lambda 表达式默认重写 Runnable 接口的 run 方法,也就是说 lambda 表达式的内容默认是作为 Runnable 接口的 run() 方法。故 lambda 语句可以这么写:

1
2
3
4
5
Runnable aa = () -> System.out.println("aa");
aa.run();// 1


new Thread(aa).start();// 2

1 和 2 都会打印字符串 aa

  1. 方法与构造函数引用:Java8 允许使用 :: 关键字来传递方法或者构造函数的引用,其实就是将类中的方法提取出来使用,使用时需要利用 FunctionalInterface 进行接收

  2. 函数式接口:将 lambda 表达式映射到一个单方法的接口上。“函数式接口” 是指仅仅只包含一个抽象方法的接口,定义了这种类型的接口,使得以其作为参数的方法,可以在调用时,使用一个 lambda 表达式作为参数。也就是说在父类引用指向子类对象)时,= 右边可以直接通过 lambda表达式实现这个接口的唯一抽象方法。每一个该类型的 lambda 表达式都会被匹配到这个抽象方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class lam {

public static void main(String[] args) {
//lambda 方法被连接到接口的 convert 方法上

Converter<String,String> converter = (from)->from+"abc";
String str = converter.convert("000");
System.out.println(str);//000abc


}
}

//传入类型为 F,传出类型为 T
interface Converter<F,T>{
T convert(F from);
}
  1. 访问局部变量,我们可以直接在 lambda 表达式中访问外层的局部变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class lam {

public static void main(String[] args) {
String abc = "abc";
Converter<String,String> converter = (from)->from+abc;
String str = converter.convert("000");
System.out.println(str);//000abc


}
}

interface Converter<F,T>{
T convert(F from);
}
-----------本文结束感谢您的阅读-----------
0%