有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用Java谓词和Lambda

为什么下面的代码返回Predicate<String>而不是boolean

我的理解是这里的!s.isEmpty()检查与谓词boolean test(T t);相反,这里的返回类型是boolean

那么在我的lambda中,我的nonEmptyStringPredicate应该不是boolean类型吗?显然不是,我只是想弄明白为什么不是

Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();

共 (6) 个答案

  1. # 1 楼答案

    在本例中,Predicate获取String作为参数,并返回boolean。 如果我们不把它写成lambda,它会是这样的:

    Predicate<String> somePredicate = new Predicate<String>() {
        @Override
        public boolean test(String string) {
            return !string.isEmpty();
        }
    };
    
  2. # 2 楼答案

    Why does the below code return Predicate and not boolean?

    这是因为函数(String s) -> !s.isEmpty()的类型是一个Predicate<String>,此时您只需定义一个函数(即“给定一个字符串作为输入,返回一个布尔值,指示它是否为空)

    请注意,此时您没有计算任何值,因此结果不是布尔值,而是一个函数

    文件中对金融机构的定义:

    Functional interfaces provide target types for lambda expressions and method references. Each functional interface has a single abstract method, called the functional method for that functional interface, to which the lambda expression's parameter and return types are matched or adapted. Functional interfaces can provide a target type in multiple contexts, such as assignment context, method invocation, or cast context:

    为了得到你正在寻找的“布尔结果”,你必须首先调用“函数方法”。例如:

    Predicate<String> nonEmptyStringPredicate = s -> !s.isEmpty();
    boolean result = nonEmptyStringPredicate.test(""); 
    
  3. # 3 楼答案

    如果你真的想从Predicate得到一个布尔值,你可以使用它的^{}方法:

    Predicate<String> nonEmptyStringPredicate = s -> !s.isEmpty();
    boolean val = nonEmptyStringPredicate.test("any"); // true
    

    另一方面^{}只是一个^{},你用一个lambda表达式来表示

  4. # 5 楼答案

    Lambda就像一个匿名类,所以:

    Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
    

    就像:

    Predicate<String> nonEmptyStringPredicate = new Predicate<String>() {
        public boolean test(String s) {
            return !s.isEmpty();
        }
    }
    
  5. # 6 楼答案

    它返回一个谓词,因为在左侧,您将谓词声明为返回类型,在右侧,您将返回谓词的test()方法的实现。 当您的代码返回一个作为函数接口实现的对象时(就像在您的例子中),您只需返回其单个抽象方法的逻辑,在本例中为test() 所以基本上就是说,如果你退回这个: Predicate<String> nonEmptyStringPredicate = new Predicate { @Override boolean test(String input) { return input.isEmpty() } } 当你在编写代码时,编译器“知道”!s.isEmpty()是方法test的逻辑,它基本上告诉你“嘿,给我逻辑,我不需要样板代码” 顺便说一句,使用方法引用是一个很好的实践,你可以用!String::isEmpty替换!s.isEmpty()