java - 来自函数引用的谓词( boolean 类型)

标签 java java-8 predicate functional-interface

我需要使用基于 boolean 函数的谓词组合流操作。通过将方法的参数作为谓词重新抛出来找到解决方法,如下所示:

public <T> Predicate<T> pred(final Predicate<T> aLambda) {
    return aLambda;
}

public List<String> foo() {
    return new ArrayList<String>().stream() //of course, this does nothing, simplified
            .filter(pred(String::isEmpty).negate())
            .collect(Collectors.toList());
}

'pred' 方法似乎什么都不做,但不是这个:

public List<String> foo() {
    return new ArrayList<String>().stream() 
            .filter((String::isEmpty).negate()) 
            .collect(Collectors.toList());
}

也没有任何内联转换:

public List<String> foo() {
    return new ArrayList<String>().stream() 
            .filter(((Predicate)String::isEmpty).negate())
            .collect(Collectors.toList());
}

似乎有效。失败并出现错误

The target type of this expression must be a functional interface

'pred(...)' 方法中发生了什么奇妙的转换?

最佳答案

你可以写一个实用方法:

class PredicateUtils {

    public static <T> Predicate<T> not(Predicate<T> predicate) {
        return predicate.negate();
    }

}

并按如下方式使用它:

.filter(not(String::isEmpty))

我相信它比转换为 Predicate<T> 更具可读性:

.filter(((Predicate<String>)String::isEmpty).negate())

虽然我会选择一个简单的 lambda:

s -> !s.isEmpty()

What the fancy conversion happens in the pred(...) method?

您已经指定了一个上下文——要使用的类型。例如,String::isEmpty可能是 Function<String, Boolean> , 或 Predicate<String> ,或者我的 @FunctionalInterface ,或其他东西。

您明确表示您期待一个 Predicate<T> ,您将返回 Predicate<T> 的一个实例.编译器现在能够确定您要使用的类型。

关于java - 来自函数引用的谓词( boolean 类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48524357/

相关文章:

predicate - 使用 Coq 证明谓词逻辑 - 初学者语法

带有选择器的 JavaScript forEach——JavaScript if 语句的功能替代

Java:一维数组在内存中是否总是连续的?

java - 带有 BufferedReader 的线程 "Thread-1"java.lang.NullPointerException 中的异常

java - 将嵌套类继承到子类

java - Java 8 流是原子的吗?

java - 将 pojo 列表合并到可以在键上组合的整数 Map

Java: "attempting to assign weaker access privilege error"(使用 1.8 编译 JDK 1.6 源代码)

java - Spring 与 JMS + ActiveMQ 集成 : Messages remain in JDBC Message Store after reconnect

swift - NSPredicate 用于搜索带双引号的字符串