java - 是否可以使用不同的类型参数将谓词与`and`链接起来?
问题描述
我正在学习 Java 8 lambda。我可以在 Predicate 接口中加入两个具有不同类型参数的谓词,使用和方法吗?
这是我的代码:
Predicate<Integer> pc = (iv) -> iv > 20;
Predicate<String> pL = (is) -> is.length() > 5;
System.out.println("The predicate result for pc is: " + pc.test(25));
System.out.println("===========");
System.out.println("The predicate result with both condition true: " + pc.and(pL.test("abcd")));
解决方案
不,您不能链接不同类型的谓词,除非链接的谓词也接受原始谓词的类型。
查看签名,您可以很容易地看到:
and(Predicate<? super T> other)
or(Predicate<? super T> other)
您可以链接谓词:
Predicate<Person> isMale = p -> p.isMale();
Predicate<Person> isAdult = p -> p.age() >= AGE_OF_MATURITY;
Predicate<Person> isAdultMale = isAdult.and(isMale);
您只能链接至少? super T
接受与原始谓词相同类型的谓词(这就是所说的):
Predicate<Object> hasWeirdHashCode = o -> o.hashCode() == 0;
Predicate<Person> nonsense = isMale.and(hasWeirdHashCode);
如果要测试不同的类型(A
, B
),需要分别提供:
Predicate<A> propertyOfA = [...];
Predicate<B> propertyOfB = [...];
BiPredicate<A,B> propertyOfAnB = (a, b) ->
propertyOfA.test(a) && propertyOfB.test(b);
如果您需要两种以上的不同类型,则需要滚动您自己的、自定义的TriPredicate
等QuadPredicate
功能接口,这些接口应该可以直接实现。
推荐阅读
- node.js - How do i create a public ledger using blockchain for my application?
- ionic-framework - @types/node@^8.0.7 的 npm WARN tarball tarball 数据似乎已损坏
- eclipse - 如何获取已执行的 Datatable 行的每一行的状态
- amazon-web-services - 将 awslogs 与 kubernetes '本机'结合使用
- mysql - 是否可以将此拒绝转换为 Rails 活动记录查询?
- java - AbstractGraphicalEditPart(GMF) 的上下文相关帮助
- c++ - 有没有简单的方法将 uchar 数组复制到双精度数组?
- python - 条件满足时如何结束循环?
- node.js - 如何修复“Aws S3 上传失败”。访问被拒绝,区域:null,状态代码:NodeJs 上的 403'
- vue.js - 本地存储修改状态?