【问题标题】:Creating a generic predicate in Java 8在 Java 8 中创建泛型谓词
【发布时间】:2014-07-20 13:01:56
【问题描述】:

我是 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;
    }
}

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());
        //...
}

【问题讨论】:

    标签: java generics lambda java-8 predicate


    【解决方案1】:

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

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

    你可以简单地使用

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

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

    public <T> Predicate<T> getGenericPredicate(Predicate<T> p) {
        //some additional code goes here
        return p;
    }
    

    然后你就可以像这样使用它了

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

    【讨论】:

    • 我要添加一个简短的解释,实例方法只是一个以对象作为第一个参数的函数,因此它可以按照您的描述使用。
    • 谢谢,不知道这个语法。
    • @Juergen 您想到了哪种语法?看起来你知道method references。如果你不知道public &lt;T&gt; Predicate&lt;T&gt; getGenericPredicate(Predicate&lt;T&gt; p){... 中的&lt;T&gt;,那么你可以在generic method tutorial 中了解更多信息,这是官方通用教程的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多