gpt4 book ai didi

groovy - java.util.function.Predicate#and 和 Groovy 2.2 闭包

转载 作者:行者123 更新时间:2023-12-01 05:12:43 24 4
gpt4 key购买 nike

我有这个运行良好的 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 的真实实例? ?

最佳答案

实际上,问题在于 Groovy 2.3 的早期版本忽略了接口(interface)中定义的默认方法。

从 Groovy 2.3 release notes :

Groovy 2.3 doesn’t support the new syntax constructs offered by Java 8 (such as lambdas, method references, default methods in interfaces, etc), but you can very well already use the new APIs offered by JDK 8, and even use Groovy closures in lieu of Java 8 lambdas.



作为 GROOVY-7104 的一部分,它在 2.3.8 和 2.4 中被固定(至少对于上述情况)

关于groovy - java.util.function.Predicate#and 和 Groovy 2.2 闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23374699/

24 4 0