Java 8 lambda 和 alpha 等价

Java 8 lambda and alpha equivalence

我想知道,有什么好的方法(如果可能的话)在 Java-8 中实现 alpha-equivalence 比较吗?

显然这两个 lambda-s 是 alpha 等价的。让我们假设在某些情况下我们想要检测这个事实。如何实现?

Predicate<Integer> l1 = x -> x == 1;
Predicate<Integer> l2 = y -> y == 1;

我对这个答案感到不安,但可能值得一提:

没有办法做到这一点。正如 Brian Goetz 在 answer to a related question 中指出的那样,从这个意义上说,没有指定的、可靠的方法来获取 lambda 的 "contents"。

但是(现在是模糊的、挥手的部分):

还没有办法

将来可能会这样做。 Java 9 可能不会,但以后会。 Project Panama 的目标不明确,其中包括让开发人员更深入地访问 lambda,帮助进一步(运行时)优化、翻译和处理。

最近,Radosław Smogura posted in the mailing list :

I try to capture lambda expression to get them as expression tree during runtime. I’m able to do it for simple lambdas like (o) -> (var == var) && ((varX == varX) && (someField + 1 == 1)), so later user can use (missing) API to examine tree.

Right now tree can be accessed with code like this:

Method m = BasicMatadataTest.class.getDeclaredMethod("lambda$meta0");
Expression e = (Expression) m.invoke(null);
BinaryExpression top = (BinaryExpression) e;
BinaryExpression vars = (BinaryExpression) top.getLefthandExpression(); // represents (var == var)
(VariableExpression) vars.getLefthandExpression() // represents first var, and it’s reference equal to vars.getRighthandExpression() as it’s same variable 

...

这里的重点可能是评论:

represents first var, and it’s reference equal to vars.getRighthandExpression() as it’s same variable

(e.b.m)

所以如果我正确理解了你的问题和这个邮件列表 post,那么就有可能确定这些表达式之间的等价性:比较树结构将是相当微不足道的(考虑到上面概述的功能) .然后它可能归结为将两个 VariableExpression 视为 "equal",而不管实际变量 name

邮件列表消息指向存储库:

(免责声明:我没有测试过这个,也不知道如何得到这个 运行(或者它是否有效)——但据我了解,它至少是 非常 接近问题的实际内容)。