在Java 8中创建通用谓词

Jue*_*gen 4 java generics lambda predicate java-8

我是Java 8的新手,想知道是否可以将实例方法传递给另一个方法,而该方法又在lambda参数上调用它:

考虑这个课程:

import java.util.function.Predicate;

public class PredicateTest {

    private class SomeType {

        public boolean bar() {
            return true;
        }

        public boolean foo() {
            return true;
        }
    }

    public void someMethod() {
        Predicate<SomeType> firstPredicate = someType -> someType.bar();
        Predicate<SomeType> secondPredicate = someType -> someType.foo();
        //...
    }

    public Predicate<SomeType> getGenericPredicate(/* ?? what goes here ?? */) {
        Predicate<SomeType> predicate = someType -> someType./* ?? how to call passed instance method foo or bar? */
        return predicate;
    }
}
Run Code Online (Sandbox Code Playgroud)

someMethod()两个谓词SomeType中创建.

如果SomeType有20种方法可能会发生,我们需要编写20个类似的谓词.

我想知道Java 8是否有可能避免代码重复使用getGenericPredicate可以采用bar()foo()作为参数的方法并返回正确的谓词.

目标是重构someMethod这样的事情:

public void someMethodRefactored() {
        Predicate<SomeType> firstPredicate = getGenericPredicate(SomeType::bar());
        Predicate<SomeType> secondPredicate = getGenericPredicate(SomeType::foo());
        //...
}
Run Code Online (Sandbox Code Playgroud)

Psh*_*emo 5

我不知道为什么你需要getGenericPredicate,而不是

public void someMethodRefactored() {
    Predicate<SomeType> firstPredicate = getGenericPredicate(SomeType::bar());
    Predicate<SomeType> secondPredicate = getGenericPredicate(SomeType::foo());
    //...
}
Run Code Online (Sandbox Code Playgroud)

你可以简单地使用

public void someMethodRefactored() {
    Predicate<SomeType> firstPredicate = SomeType::bar;
    Predicate<SomeType> secondPredicate = SomeType::foo;
    //...
}
Run Code Online (Sandbox Code Playgroud)

假设getGenericPredicate实际上需要做一些额外的任务(例如日志记录),你可以试试

public <T> Predicate<T> getGenericPredicate(Predicate<T> p) {
    //some additional code goes here
    return p;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像使用它一样

public void someMethodRefactored() {
    Predicate<SomeType> firstPredicate = getGenericPredicate(SomeType::bar);
    Predicate<SomeType> secondPredicate = getGenericPredicate(SomeType::foo);
    //...
}
Run Code Online (Sandbox Code Playgroud)