首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java 8中创建泛型谓词

在Java 8中创建泛型谓词
EN

Stack Overflow用户
提问于 2014-07-20 13:01:56
回答 1查看 8.1K关注 0票数 5

我对Java 8相当陌生,我想知道是否有可能将实例方法传递给另一个方法,后者反过来在lambda参数上调用它:

考虑一下这门课:

代码语言:javascript
复制
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;
    }
}

someMethod()中,创建了两个SomeType谓词。

如果SomeType有20个方法,那么我们可能需要编写20个类似的谓词。

我想知道Java8是否有可能避免使用像getGenericPredicate这样的方法重复代码,该方法可以使用bar()foo()作为参数,并返回正确的谓词。

其目标是将someMethod重构为如下所示:

代码语言:javascript
复制
public void someMethodRefactored() {
        Predicate<SomeType> firstPredicate = getGenericPredicate(SomeType::bar());
        Predicate<SomeType> secondPredicate = getGenericPredicate(SomeType::foo());
        //...
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-20 13:14:34

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

代码语言:javascript
复制
public void someMethodRefactored() {
    Predicate<SomeType> firstPredicate = getGenericPredicate(SomeType::bar());
    Predicate<SomeType> secondPredicate = getGenericPredicate(SomeType::foo());
    //...
}

你可以直接用

代码语言:javascript
复制
public void someMethodRefactored() {
    Predicate<SomeType> firstPredicate = SomeType::bar;
    Predicate<SomeType> secondPredicate = SomeType::foo;
    //...
}

假设getGenericPredicate实际上需要执行一些附加任务(例如日志记录),您可以尝试使用

代码语言:javascript
复制
public <T> Predicate<T> getGenericPredicate(Predicate<T> p) {
    //some additional code goes here
    return p;
}

然后你就可以像

代码语言:javascript
复制
public void someMethodRefactored() {
    Predicate<SomeType> firstPredicate = getGenericPredicate(SomeType::bar);
    Predicate<SomeType> secondPredicate = getGenericPredicate(SomeType::foo);
    //...
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24850748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档