Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法
interface Formula { double calculate(int a); default double sqrt(int a) { return Math.sqrt(a); } }
例子: Formula接口在拥有calculate方法之外同时还定义了sqrt方法,实现了Formula接口的子类只需要实现一个calculate方法,默认方法sqrt将在子类上可以直接使用
Formula formula = new Formula() { @Override public double calculate(int a) { return sqrt(a * 100); } }; formula.calculate(100); // 100.0 formula.sqrt(16); // 4.0
第一种:
Collections.sort(names, (String a, String b) -> { return b.compareTo(a); });
第二种: 对于函数体只有一行代码的,你可以去掉大括号{}以及return关键字
Collections.sort(names, (String a, String b) -> b.compareTo(a)
第三种: Java编译器可以自动推导出参数类型,所以你可以不用再写一次类型
Collections.sort(names, (a, b) -> b.compareTo(a)
每一个lambda表达式都对应一个类型,通常是接口类型。而***函数式接口*是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。因为默认方法不算抽象方法,所以你也可以给你的函数式接口添加默认方法。
可以将lambda表达式当作任意只包含一个抽象方法的接口类型,确保你的接口一定达到这个要求,你只需要给你的接口添加 @FunctionalInterface 注解,编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的。
@FunctionalInterface interface Converter<F, T> { T convert(F from); } Converter<String, Integer> converter = (from) -> Integer.valueOf(from); Integer converted = converter.convert("123"); System.out.println(converted); // 123
Java 8 允许你使用**: