У меня есть этот код 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)? - person Stuart Marks   schedule 30.04.2014p3, 2) в Java 8 у вас естьp1.and(p2), в Groovy у вас естьp2.and(p1)вp3, обратите внимание на обратный порядок. - person skiwi   schedule 30.04.2014