gpt4 book ai didi

java - 在 Java 8 中创建通用谓词

转载 作者:搜寻专家 更新时间:2023-11-01 02:25:26 25 4
gpt4 key购买 nike

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

最佳答案

我不确定你为什么需要 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);
//...
}

关于java - 在 Java 8 中创建通用谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24850748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com