【发布时间】:2014-04-29 20:32:17
【问题描述】:
我有这个运行良好的 Java 8 代码:
//Java 8
@Test public void testPredicates(){
Predicate<Integer> p1 = (i) -> true;
Predicate<Integer> p2 = (i) -> true;
Predicate<Integer> p3 = p1.and(p2);
List<Integer> is = new ArrayList<>();
is.add(1);
is.add(2);
assertTrue(is.stream().allMatch(p1.and(p2)));
}
我在 Groovy (2.2) 中最接近它的是:
//Groovy 2.2
@Test
void test(){
Predicate<Integer> p1 = { i -> true}
Predicate<Integer> p2 = {i -> true}
Predicate<Integer> p3 = p2.and(p1)
List<Integer> is = new ArrayList<>()
is.add(1)
is.add(2)
assert(is.stream().allMatch(p1.and(p2)))
}
Groovy 代码在调用and 方法的那一行出现以下错误:
java.lang.ClassCastException: java.lang.Boolean
cannot be cast to java.util.function.Predicate
如果我只用assert(is.stream().allMatch(p1)) 替换断言,则测试成功完成。问题是在谓词上调用and 方法。
在调试器中检查例如p2,我可以看到它的类型为OneParameterTest$_test_closure2。反编译字节码可以验证这一点。
虽然我不确定,但我有一种感觉,这与隐式闭包强制有关(请参阅 http://groovy.codehaus.org/Groovy+2.2+release+notes)。
有没有办法编写 Groovy 代码,以便将谓词创建为 java.util.function.Predicate 的真实实例?
【问题讨论】:
-
如果你写
allMatch(p3),groovy 版本是否有效? -
关于您的问题的两个小问题:1) 您从未使用过
p3,2) 在 Java 8 中您有p1.and(p2),在 Groovy 中您在p3中有p2.and(p1),请注意颠倒的顺序。 -
优点,但都不是问题。在谓词上调用“and”是问题所在。
-
尝试使用 Groovy 2.3(支持 Java 8),我得到了相同的结果。也许将此发布到 groovy-user 邮件列表?
-
好的,我已经发布了 - 让我们看看是否有任何回复...