【发布时间】:2019-09-11 10:46:41
【问题描述】:
我尝试过:
public class HelloWorld {
public static void main(String... args){
final String string = "a";
final Supplier<?> supplier = string::isEmpty;
System.out.println(supplier);
}
}
我明白了:
HelloWorld$$Lambda$1/471910020@548c4f57
我想得到字符串isEmpty。我该怎么做?
编辑:我创建的方法的代码是这个:
public class EnumHelper {
private final static String values = "values";
private final static String errorTpl = "Can't find element with value `{0}` for enum {1} using getter {2}()";
public static <T extends Enum<T>, U> T getFromValue(T enumT, U value, String getter) {
@SuppressWarnings("unchecked")
final T[] elements = (T[]) ReflectionHelper.callMethod(enumT, values);
for (final T enm: elements) {
if (ReflectionHelper.callMethod(enm, getter).equals(value)) {
return enm;
}
}
throw new InvalidParameterException(MessageFormat.format(errorTpl, value, enumT, getter));
}
}
问题是我不能作为参数 T::getValue 传递,因为 getValue 不是静态的。而且我不能传递 someEnumElem::getValue,因为get() 将返回该元素的值。我可以在 for 循环中使用:
Supplier<U> getterSupllier = enm:getValue;
if (getterSupllier.get().equals(value)) {
[...]
}
但是这样getValue 是固定的,我不能将它作为参数传递。我可以使用一些第三方库来做一个eval(),但我真的不想打开那个潘多拉花瓶:D
编辑 2:Function 确实适用于无参数方法,但仅适用于 Java 11。不幸的是,我坚持使用 Java 8。
【问题讨论】:
-
@MCEmperor 至少非常:为了调试,不打印
"Checking elements for HelloWorld$$Lambda$1/471910020@548c4f57",而是打印"Checking elements for isEmpty"。那太好了…… -
@Marco13 这意味着某种
toString和 lambdas 或方法引用的 identity,设计者并没有故意这样做 IIRC。 -
@MCEmperor:这是给
enums的。我创建了一个通用方法,它从一个枚举、一个值和一个 getter 名称返回带有该值的enum元素,由指定的 getter 返回。唯一的技巧是我想从 getter 本身中提取 getter 的名称,而不是传递字符串,例如“getValue”。这是因为如果enum中的 getter 发生更改,编译器会通知我在调用此方法时也必须更改它。 -
那么为什么不让你的方法接受
Function而不是getter 名称呢?然后,与其尝试找出 getter 名称,而只是搜索要调用的正确方法,而是在函数上调用apply,它已经调用了正确的方法。 -
@MarcoSulla 你能把它(最好是用代码)添加到问题中吗?也许我们可以想出点什么……
标签: java methods java-8 functional-programming method-reference