Java 8 在Java8中传递对实例方法的引用
我有一个类,它有几个返回相同类型的方法。例如,我有以下对象定义:Java 8 在Java8中传递对实例方法的引用,java-8,Java 8,我有一个类,它有几个返回相同类型的方法。例如,我有以下对象定义: interface MyClass { String first(); String second(); } 然后我有一个方法,它接受这个类的对象列表,并且应该根据参数调用first()或second()方法。例如: void myMethod(List<MyClass> objs, boolean executeFirst) { objs.forEach(obj -> System.out.p
interface MyClass {
String first();
String second();
}
然后我有一个方法,它接受这个类的对象列表,并且应该根据参数调用first()
或second()
方法。例如:
void myMethod(List<MyClass> objs, boolean executeFirst) {
objs.forEach(obj -> System.out.println(executeFirst ? obj.first() : obj.second()));
}
您需要的是功能
,而不是供应商:
public void foo() {
myMethod(someList, MyClass::first);
}
void myMethod(List<MyClass> objs, Function<MyClass, String> instanceMethod) {
objs.forEach(obj -> System.out.println(instanceMethod.apply(obj));
}
public void foo(){
myMethod(someList,MyClass::first);
}
void myMethod(列表对象,函数instanceMethod){
objs.forEach(obj->System.out.println(instanceMethod.apply(obj));
}
正如您所提到的,您的类中将有许多方法,您需要根据一些标志调用它们
因此,您需要在某个地方维护此元信息,最好是一张地图
Map<String, Function<MyClass, String>> meta = new HashMap<>()
Map meta=newhashmap()
您可以将此元传递给方法,也可以将其作为类的一部分
我已经把它传给了方法,但我希望你能明白
void myMethod(List<MyClass> objs, meta, Supplier<String> flag) {
objs.stream().forEach(obj -> meta.get(flag.get()).apply(obj));
}
void myMethod(列出对象、元、供应商标志){
objs.stream().forEach(obj->meta.get(flag.get()).apply(obj));
}
使用java reflectionyou's defined a interface not a class.FGITW!我正要发布objs.stream().map(instanceMethod).forEach(System.out::println)
那也不错。不过forEachOrdered()会更正确。当然,但我可以在晚上睡觉,期待列表
impl按顺序处理它的流。
void myMethod(List<MyClass> objs, meta, Supplier<String> flag) {
objs.stream().forEach(obj -> meta.get(flag.get()).apply(obj));
}