【发布时间】:2017-03-18 16:22:32
【问题描述】:
有时命名 lambdas 很有用。特别是当您将它们作为参数传递时。
一个非常简单的例子是
public class Main {
public static void main(String[] args) {
Predicate<String> p = nameIt("isNotEmpty", (s) -> !s.trim().isEmpty());
maybePrint("Hello", p);
maybePrint(" ", p);
}
static <T> void maybePrint(T s, Predicate<T> pred) {
if (pred.test(s)) {
System.out.println(s.toString());
} else {
System.err.println(pred + " says no to \"" + s + "\"");
}
}
}
如果 jvm 有一些功能来命名 lambdas 而不会失去幕后的出色性能优化,那就太好了。
这样的想法对我来说很好:
Predicate<String> p = nameIt("isNotEmpty", (s) -> !s.trim().isEmpty());
【问题讨论】:
-
方法引用类似于“命名”lambda
-
基于方法引用的 lambda 在运行时没有可调试的字符串。既不是 toString 结果,也不是调试器(至少在 Eclipse 中)视图。
-
你是对的,但现在我了解到你有时可以得到它,请参阅[如何获取 Java 8 方法参考的 MethodInfo? ](stackoverflow.com/questions/19845213/…)。我让它正常工作,有兴趣吗?
-
我真的很喜欢这个想法:benjiweber.co.uk/blog/2013/12/28/…。我认为它只适用于非静态方法引用,您需要能够使用运行时字节码生成库。
标签: java debugging lambda jvm tostring