Java 8 新特性
文章目录
1. Lambda表达式
Lambda 表达式是一个匿名函数,可以作为一个参数传递,使用Lambda表达式必须使用函数式接口,具体可以见下个章节。
2. 函数式接口
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法的接口,通过@FunctionalInterface申明函数式接口。
@FunctionalInterface
public interface MyFunctionInterface {
void execute();
}
典型使用场景就是作为方法的参数(可以用于模板模式)
public class Module {
public void execute(MyFunctionInterface inter) {
// 前置操作
...
inter.execute();
// 后置操作
...
}
}
可以作为Lambda表达式调用,有些场景的代码执行后,结果不一定会被使用,从而造成性能浪费。而Lambda表达式是延迟执行的,这正好可以作为解决方案,提升性能。例如日志打印场景。
public static void main(String[] args) {
Module module = new Module();
module.execute(() -> {
System.out.println("Lambda表达式应用");
});
}
2.1 常用函数式接口
- java.util.function.Supplier
- java.util.function.Consumer
- java.util.function.Predicate
- java.util.function.Function
public static void main(String[] args) {
String str = "xxx,1991";
int age = getAgeNum(str, s -> s.split(",")[1],
s -> Integer.parseInt(s),
n -> 2021 - n);
System.out.println(age);
}
private static int getAgeNum(String str, Function<String, String> one,
Function<String, Integer> two,
Function<Integer, Integer> three) {
return one.andThen(two).andThen(three).apply(str);
}
3. 方法引用
Java 8 支持方法引用, 可以直接引用已有Java类或对象的方法或构造器。方法引用与lambda表达式结合使用,可以进一步简化代码。
Java 8 有四种引用方式
- 静态方法引用 ClassName::staticMethodName
- 构造器引用 ClassName::new
- 类的任意对象的实例方法引用 ClassName::instanceMethodName
- 特定对象的实例方法引用 object::instanceMethodName
lambda表达式可用方法引用代替的场景可以简要概括为:lambda表达式的主体仅包含一个表达式,且该表达式仅调用了一个已经存在的方法。方法引用的通用特性:方法引用所使用方法的入参和返回值与lambda表达式实现的函数式接口的入参和返回值一致。
代码示例:
public static void main(String[] args) {
List<String> strList = Arrays.asList(new String[]{
"a", "c", "b"});
strList.stream().sorted((s1, s2) -> s1.compareToIgnoreCase(s2)).forEach(s -> System.out.println(s));
}
使用方法引用后
public static void main(String[] args)