我对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个类似的谓词。
我想知道Java8是否有可能避免使用像getGenericPredicate这样的方法重复代码,该方法可以使用bar()或foo()作为参数,并返回正确的谓词。
其目标是将someMethod重构为如下所示:
public void someMethodRefactored() {
Predicate<SomeType> firstPredicate = getGenericPredicate(SomeType::bar());
Predicate<SomeType> secondPredicate = getGenericPredicate(SomeType::foo());
//...
}发布于 2014-07-20 13:14:34
我不知道你为什么需要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);
//...
}https://stackoverflow.com/questions/24850748
复制相似问题