Java8中的复合谓词

Java8中的复合谓词,java,lambda,java-8,Java,Lambda,Java 8,在番石榴中,我们可以做像 Predicate<String> isEmpty = Predicates.compose(String::length, Integer.valueOf(0)::equals); // contrived, I know Predicate isEmpty=Predicates.compose(String::length,Integer.valueOf(0)::equals);//我知道这是人为的 我们可以在Java8中做类似的事情吗?比如说 Pr

在番石榴中,我们可以做像

Predicate<String> isEmpty = Predicates.compose(String::length, Integer.valueOf(0)::equals); // contrived, I know
Predicate isEmpty=Predicates.compose(String::length,Integer.valueOf(0)::equals);//我知道这是人为的
我们可以在Java8中做类似的事情吗?比如说

Predicate<Integer> isZero = Integer.valueOf(0)::equals;
Predicate<String> isEmpty = isZero.compose(String::length);
谓词isZero=Integer.valueOf(0)::等于;
谓词isEmpty=isZero.compose(字符串::长度);
还是实现相同功能的库函数


请注意,我并不是问自己如何做到这一点(
s->isZero.test(s.length)
可以很好地工作),也不是问为什么这样做行不通(Lambda类型是推断出来的等等)

您可以很容易地编写一个
compose
方法,并在多个地方使用它:

import java.util.function.*;

public class Test {
    public static void main(String[] args) {
        Integer zero = 0;
        Predicate<Integer> isZero = zero::equals;
        Predicate<String> isEmpty = compose(String::length, isZero);

        System.out.println(isEmpty.test("")); // true
        System.out.println(isEmpty.test("x")); // false
    }

    // Composition of a function with a predicate
    public static <T, S> Predicate<T> compose(Function<T, S> first, Predicate<S> second) {
        return input -> second.test(first.apply(input));
    }
}
import java.util.function.*;
公开课考试{
公共静态void main(字符串[]args){
整数0=0;
谓词isZero=zero::equals;
谓词isEmpty=compose(字符串::长度,为零);
System.out.println(isEmpty.test(“”);//true
System.out.println(isEmpty.test(“x”);//false
}
//函数与谓词的组合
公共静态谓词组合(函数第一,谓词第二){
返回输入->第二次测试(第一次应用(输入));
}
}

(我删除了对
Integer.ZERO的引用,因为它不存在…

你是在寻找类似于这里描述的东西吗->没有类似于
谓词的内置内容。compose(…)
。我想你是在寻找像Scala一样的一等公民函数:例如
val isZero=(x:Int)=>x==0
val size=(s:String)=>s.length
val为空=size,然后为零
,这是数学意义上的函数组合`f o g(x)`您不需要为
函数定义
组合
。它已经存在于
函数
界面-
默认函数中(Function@Eran:啊,很好,我没有看到:)@Jorn:你给出了一个硬编码的示例,而我提供了可重用的表单。不清楚您是否知道如何构建它,也不清楚您为什么会关心可重用表单是在Java 8标准库中还是在您自己的库中。@Jorn:如前所述,您可以使用
f。然后(Predicate.isEqual(value)::test)::apply
,如果使用现有功能对您来说很重要的话。否则,lambda表达式没有什么错,尤其是因为它比假定的工厂方法更短、更有效。但是请注意,
谓词isZero=Predicate.isEqual(0)确实存在。