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)
我不知道为什么你需要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)