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版权协议,转载请附上原文出处链接和本声明。