java8 新特性
看了下java8的新特性,记下笔记,
1.添加了Optional,
这个是guava里面出现的,现在java8里面也支持了,Optional是用来处理null值的。
用法基本和guava里面的一致,
public static void main(String[] args) { Optional<String> str = Optional.of("abc"); System.out.println(str.isPresent()); System.out.println(str.get()); str = Optional.empty(); System.out.println(str.isPresent()); System.out.println(str.orElse("abcd")); }
输出的值为:
true
abc
false
abcd
当里面有值的时候,使用orElse是会得到原来的值的,如当
Optional<String> str = Optional.of("abc");
System.out.println(str.orElse("123"));
这时输出的是abc
2.接口中能添加默认方法了,示例如下
public interface Formula { double calculate(int a); /** * java8 新特性 接口中能添加默认方法,又叫做扩展方法,实现这个接口,不需要重写默认方法,可以直接用 * @param a * @return */ default double sqrt(int a) { return Math.sqrt(a); } }
默认方法可以实现,需要用default关键字
实现这个接口的类不需要重写默认方法
3.@FunctionalInterface 注解,
用这个注解标记的接口会被认为是函数接口,即只有一个抽象方法(默认方法不是抽象方法),当有多个抽象方法的时候会出现编译错误提示
4.lambda表达式,这个是很多人都知道的变化
当实现函数式接口的时候可以使用lambda表达式
如
Collections.sort(list, new Comparator<String>() { @Override public int compare(String a, String b) { return b.compareTo(a); } }); Collections.sort(list, (String a, String b) -> b.compareTo(a)); Collections.sort(list, (String a, String b) -> { return b.compareTo(a); }); Collections.sort(list,(a,b) -> b.compareTo(a));
这上面四种写法是等效的
lambda表示式的基本形式为 () -> {}
当整个实现写在一行时,可以去掉小括号和return关键字,()里面的是参数,可以省略参数类型
5.方法和构造器的引用
示例:
public class Person { private String firstName; private String lastName; Person(){} Person(String firstName, String listName) { this.firstName = firstName; this.lastName = listName; } public String getFirstName() { return firstName; } public String getLastName() { return lastName; } public static void main(String[] args) { PersonFactory<Person> factory = Person::new; Person person = factory.createPerson("luo","lei"); System.out.println(person.getFirstName()+" "+person.getLastName()); } }
public interface PersonFactory<T extends Person> { T createPerson(String firstName, String lastName); }
使用::关键字,可以引用方法或构造器,这个接口只能是函数式接口
当然java8 还添加了一些接口,和其他的特性,我没看完
java8 的新特性就记录到这里