内容目录
关于java中的Predicate的赋值问题
显式赋值与强转
先看一段例子:
public static Predicate<ArrayList> test1() {
Predicate<ArrayList> p;
return p = s -> s != null;
}
public static Predicate<ArrayList> test2() {
List<Predicate<ArrayList>> list = Collections.singletonList(1).stream().map(i -> {
return s -> s.size() == 0;
}).collect(Collectors.toList());
return list.get(0);
}
public static Predicate<ArrayList> test3() {
List<Predicate<ArrayList>> list = Collections.singletonList(1).stream().map(i -> {
return (Predicate<ArrayList>) s -> s.size() == 0;
}).collect(Collectors.toList());
return list.get(0);
}
在Java中,Lambda表达式的类型推断是基于上下文的目标类型( target type
)。上述的函数中,Lambda表达式需要被推断为 Predicate<ArrayList>
类型。
当你直接返回Lambda表达式时,编译器需要明确知道返回类型是什么。在某些情况下,编译器可能无法从上下文中推断出确切的类型,因此需要进行显式类型转换(cast)。
在函数 test1()
中,使用等于号将Lambda表达式赋值给一个显式声明的变量p,这个变量的类型是明确的Predicate
public static Predicate<ArrayList> test1() {
Predicate<ArrayList> p;
return p = s -> s != null;
}
对于 test2()
函数,java无法解析,无法获取 s.size()
函数,因为编译器不能从上下文中推断出这个类型,就需要显式地进行类型转换:
public static Predicate<ArrayList> test3() {
List<Predicate<ArrayList>> list = Collections.singletonList(1).stream().map(i -> {
return (Predicate<ArrayList>) s -> s.size() == 0;
}).collect(Collectors.toList());
return list.get(0);
}
总结
使用等于号将Lambda表达式赋值给一个显式声明的变量,可以避免显式类型转换,因为编译器能够从变量的类型推断出Lambda表达式的类型。而直接返回Lambda表达式时,如果编译器无法推断出类型,就需要显式类型转换。