jdk1.8新特性

jdk1.8新特性

接口

jdk1.8之前:

接口只能是抽象类和常量

jdk1.8之后:

允许有默认方法和静态方法
interface Formula {
    double calculate(int a);
    default double sqrt(int a) {
        return Math.sqrt(a);
    }
}

Lambda 表达式

Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁。当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口。下面这个例子就是使用Lambda语法来代替匿名的内部类,代码不仅简洁,而且还可读。

jkd1.8之前

button.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent actionEvent){
        System.out.println("Action detected");
    }
});

jdk1.8之后:

button.addActionListener( actionEvent -> { 
    System.out.println("Action detected");
});

Lambda 表达式的使用

语法一(无参数,无返回值)

@Test
public void test(){
    Runnable a = new Runnable(){
     @Override
     public void run(){
        System.out.println("Hello World!")
    }
    };
    //Lambda写法
    Runnable a1 = () -> System.out.println("Hello World!");
    a1.run();
}

语法二(有一个参数,并且无返回值)

//此处左侧参数若是只有一个可省略小括号 即:x -> System.out.println(x)
(x) -> System.out.println(x)

语法三(有两个以上的参数,有返回值,并且 Lambda 体中有多条语句)

Comparator <Integer> com = (x, y) -> {
    System.out.println("函数式接口");
    return Integer.compare(x, y);
};

语法四(若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写)

Comparator <Integer> com = (x, y) -> Integer.compare(x, y);

语法五( Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”)

(Integer x, Integer y) -> Integer.compare(x, y);
注 : Lambda 表达式中的参数类型都是由编译器推断得出的。 Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。 Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的 “类型推断”;

函数式接口

函数式接口就是只定义一个抽象方法的接口
我们可以将lambda表达式当作任意只包含一个抽象方法的接口类型,在定义"函数式接口"时,为防止发生定义错误.可以使用@FunctionalInterface注解,强制按照"函数式接口"的语法检查,如果语法错误.编译器将会报错.
interface Fun {
    int myMethod(int x, int y);
}
public class aa{
    private static int doSomething(Fun fun, int x, int y){
        return fun.myMethod(x, y);
    }
    public static void main(String[] args){
        System.out.println(doSomething((x, y) -> x + y, 8, 1));
    }

}

方法与构造函数引用

Java 8 允许你使用 :: 关键字来传递方法或者构造函数引用
Converter<String, Integer> converter = Integer::valueOf;
Integer converted = converter.convert("123");
System.out.println(converted);

新的Date API

Java 8 在包java.time下包含了一组全新的时间日期API。

重复注解

自从Java 5中引入注解以来,这个特性开始变得非常流行,并在各个框架和项目中被广泛使用。不过,注解有一个很大的限制是:在同一个地方不能多次使用同一个注解。Java 8打破了这个限制,引入了重复注解的概念,允许在同一个地方多次使用同一个注解。
@Hint("hint1")
@Hint("hint2")
class Person {}

HashMap增加红黑树

是由数组+链表+红黑树构成。新增了红黑树作为底层数据结构,结构变得复杂了,但是效率也变的更高效。当一个值中要存储到Map的时候会根据Key的值来计算出他的hash,通过哈希来确认到数组的位置,如果发生哈希碰撞就以链表的形式存储。但是这样如果链表过长的话,HashMap会把这个链表转换成红黑树来存储。

版权声明:本文为haihz原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。