Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java8Lambda和alpha等价_Java_Lambda_Java 8_Lambda Calculus - Fatal编程技术网

Java8Lambda和alpha等价

Java8Lambda和alpha等价,java,lambda,java-8,lambda-calculus,Java,Lambda,Java 8,Lambda Calculus,我想知道,在Java-8中实现比较有什么好方法(如果可能的话) 显然,这两个lambda-s是α等价的。让我们假设,在某些情况下,我们想要发现这一事实。如何实现这一目标 Predicate<Integer> l1 = x -> x == 1; Predicate<Integer> l2 = y -> y == 1; 谓词l1=x->x==1; 谓词l2=y->y==1; 我对这个问题的回答非常勉强,但值得一提的是: 没有办法做到这一点。正如Brian Goe

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

显然,这两个lambda-s是α等价的。让我们假设,在某些情况下,我们想要发现这一事实。如何实现这一目标

Predicate<Integer> l1 = x -> x == 1;
Predicate<Integer> l2 = y -> y == 1;
谓词l1=x->x==1;
谓词l2=y->y==1;
我对这个问题的回答非常勉强,但值得一提的是:

没有办法做到这一点。正如Brian Goetz在一篇文章中指出的那样,从这个意义上说,没有特定的、可靠的方法来获取lambda的“内容”

但是(现在是含糊不清的手工部分):

现在还没有办法做到这一点

将来可能会这样做。也许不使用Java9,但以后再使用。其中,有一个模糊的目标,即让开发人员更深入地访问lambdas,帮助进一步(运行时)优化、翻译和处理

最近:

我尝试捕获lambda表达式,以便在运行时将它们作为表达式树。我可以为简单的lambda做这件事,比如(o)->(var==var)&&((varX==varX)&&&(someField+1==1)),所以以后用户可以使用(缺失的)API来检查树

现在可以使用如下代码访问树:

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 

这里的关键点可能是评论:

表示第一个变量,它的引用等于vars.getRighthandExpression()作为同一个变量

(e.b.m)

因此,如果我正确地理解了您的问题和这篇邮件列表文章,那么就有可能确定这些表达式之间的等价性:比较树结构将是相当简单的(考虑到上面概述的功能)。然后它可以归结为将两个
变量表达式
视为“相等”,而不管实际的变量名是什么

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


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

@holi java这不是OP想要的……如果情况像给定示例中那样简单,那么比较JVM指令就可以解决问题,因为您可以忽略变量名甚至泛型类型,而只比较指令列表。像这样的框架可以帮助解释和比较字节码指令,但这可能需要大量的工作。@Andremoniy serializeable可能是一个选项,但我考虑的是更大的lambda表达式中的指令顺序,它们可以是等价的,但顺序不同。。。我必须尝试一下,你可以使用插装来读取lambda类,然后使用类似asm库的工具来计算它们是否等价,这对于你提供的一个简单示例来说可能足够了,但对于更复杂的情况来说它不起作用。@Marco13:)一旦有人提供了这样的答案,我会考虑改变我的决定。基本上短的版本将是不可能的;可能会发生,但不会早于jdk-10。可能是关键词。这很有趣,谢谢+1但如果有人发现有任何结果,他仍将等待一段时间serialization@Andremoniy当然,这个答案不够深刻,不足以让人接受。可能有序列化、ASM或其他字节码魔术的选项,我也很想看到它们(即使它们可能在某种程度上依赖于实现或依赖于其他未指定的细节)。但我认为,最终,邮件列表(@Eugene;-)中描绘的路径可能会通向一个真正的、合适的API来实现这一目标。我终于明白OP想要做什么了。加一。他想比较lambda体的逻辑是否等价。我说得对吗,先生?但同一逻辑有许多组合。@holi-java-Yes。关于等价性的正式定义,请参见。据我所知,这个问题的一个核心方面是,是否有一种方法可以通过编程获得lambda的“内容”(这样就可以实现Wikipedia站点上描述的逻辑)。(我认为序列化方法只适用于非常有限的情况,如果有的话,但这是另一个问题)。