关于java中的Predicate的赋值问题
内容目录

关于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。因此,编译器能够推断出Lambda表达式的类型,无需显式类型转换:

    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表达式时,如果编译器无法推断出类型,就需要显式类型转换。

上一篇