在Java 8中传递对实例方法的引用

时间:2018-01-08 21:14:46

标签: java-8

我有一个类,它有几个返回相同类型的方法。因此,例如,我有以下对象定义:

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

有没有办法用引用和实例方法替换executeFirst参数,我想在objs对象上执行?所以,例如,理想情况下我想要这样的东西:

void myMethod(List<MyClass> objs, Supplier<String> instanceMethod) {
    objs.forEach(obj -> System.out.println(obj::instanceMethod.get());
}

2 个答案:

答案 0 :(得分:5)

您需要Function<MyClass, String>,而不是供应商:

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

答案 1 :(得分:0)

正如你所提到的,你的课程中会有很多方法,你需要根据一些标志来调用它们。

因此,您需要在某处保留此元信息,最好是地图。

Map<String, Function<MyClass, String>> meta = new HashMap<>()

您可以将此元数据传递给该方法,也可以将其作为该类的一部分。

我已将其传递给该方法,但我希望您明白这一点。

void myMethod(List<MyClass> objs, meta, Supplier<String> flag) {
    objs.stream().forEach(obj -> meta.get(flag.get()).apply(obj));
}