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));
}