静态方法引用
使用方式:Class::staticMethod
test.operate(1, 2, Test::add);
对象的实例方法引用
使用方式:instance::method
test.operate(1, 2, test::sub);
类的实例方法引用
使用方式:Class::method
test.test(Test::testM);
其实上面三种方法引用都好理解,最后类的实例方法引用,有两个条件:
-
首先要满足实例方法,而不是静态方法
-
Lambda 表达式的第一个参数会成为调用实例方法的对象
根据这两点我们看上面的例子,test 方法接受一个 TestInt 实例,用 Lambda 表达式表示就是 (Test t1, Test t2) -> res,而我们调用 test 方法时传入的方法引用是 Test::testM,其参数也是一个 Test 实例,最终 test.test(Test::testM) 的调用效果就是 t1.testM(t2)
2.1.3 接口默认方法和静态方法
Java 8 新增了接口的默认实现,通过 default 关键字表示。同时也可以提供静态默认方法。
public interface TestInterface {
String test();
// 接口默认方法
default String defaultTest() {
return “default”;
}
static String staticTest() {
return “static”;
}
}
2.1.4 重复注解
Java 8 支持了重复注解。在 Java 8 之前想实现重复注解,需要用一些方法来绕过限制。比如下面的代码。
@interface Author {
String name();
}
@interface Authors {
Author[] value();
}
@Authors({@Author(name=“a”), @Author(name = “b”)})
class Article {
}
而在 Java 8 中,可以直接用下面的方式。
@Repeatable(Authors.class)
@interface Author {
String name();
}
@interface Authors {
Author[] value();
}
@Author(name = “a”)
@Author(name = “b”)
class Article {
}
在解析注解的时候,Java 8 也提供了新的 API。
AnnotatedElement.getAnnotationsByType(Class)
2.1.5. 类型注解
Java 8 之前注解只能用在声明中,在 Java 8 中,注解可以使用在 任何地方。
@Author(name=“a”)
private Object name = “”;
private String author = (@Author(name=“a”)String) name;
2.1.6. 更好的类型推断
Java 8 对于类型推断做了改进。
比如在 Java 7 中下面的写法:
List stringList = new ArrayList<>();
stringList.add(“A”);
stringList.addAll(Arrays.asList());
在 Java 8 中改进后的写法,可以自动做类型推断。
List stringList = new ArrayList<>();
stringList.add(“A”);
stringList.addAll(Arrays.asList());
2.1.7. Optional
Java 8 中新增了 Optional 类用来解决空指针异常。Optional 是一个可以保存 null 的容器对象。通过 isPresent() 方法检测值是否存在,通过 get() 方法返回对象。
除此之外,Optional 还提供了很多其他有用的方法,具体可以查看文档。下面是一些示例代码。
// 创建一个 String 类型的容器
Optional str = Optional.of(“str”);
// 值是否存在
boolean pre = str.isPresent();
// 值如果存在就调用 println 方法,这里传入的是 println 的方法引用
str.ifPresent(System.out::println);
// 获取值
String res = str.get();
// 传入空值
str = Optional.ofNullable(null);
// 如果值存在,返回值,否则返回传入的参数
res = str.orElse(“aa”);
str = Optional.of(“str”);
// 如果有值,对其调用映射函数得到返回值,对返回值进行 Optional 包装并返回
res = str.map(s -> “aa” + s).get();
// 返回一个带有映射函数的 Optional 对象
res = str.flatMap(s -> Optional.of(s + “bb”)).flatMap(s -> Optional.of