java8 Predicate接口中的negate()默认方法用java7如何实现?
negate()源码为:
default Predicate<T> negate() {
return (t) -> !test(t);
}
我理解的可以转换为:
default Predicate<T> negate() {
return new Predicate<T>() {
public boolean test(T t) {
!test(t);
}
};
}
但是这样转化的话test()就成了死循环了啊,是我理解的不对吗?正确的转换是什么,请大家多多指教
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
首先给出我认为的正确写法吧(我copy了
Predicat
类,然后改名为PredicateExt
进行重写)再来看看Java8中
Predicate.negate
到底表达的是什么意思Predicate
肯定是一个类,(t) -> !test(t)
这种lamdba
语法也只是表示Predicate
的一个对象而已default
方法就是代表了Predicate
对象的某个实例方法因此结合以上两点,可以直接看出
Predicate.negate
代表Predicate
的某个对象A执行时,根据A的执行结果再次创建了一个新Predicate
的对象B所以,要换种方式来表示
Predicate.negate
方法,肯定也要体现出A,B两个新旧对象,并且该方法的执行结果是根据A的执行结果体现出来的再来说说题主为什么会死循环,虽然题主已经明显
new
了一个Predicate
对象,这里体现了A,B两个新旧对象,但是后面的执行结果并没有体现出是根据A的执行结果来产生B的主要在于里面的在重写B的
test
方法时,是再调用test
方法的,只是前面加了一个!
,所以显然这里调用的是B的Predicate
的test
方法,当然就是循环调用了,可别指望它能调用A的Predicate
方法,因为你正在重写这个新Predicate
的方法,这里的this
指针,肯定是指向B的鉴于此,既然在B里面重写方法时
this
指针是指向B的,那就在外面显示的把A的对象指示出来,然后再B中重写时,显示用的A的方法进行执行,这样就可以了,所以才有上面的写法从运行的debug来看,以前的方式和现在重写的方式,在新的B对象中,都包含了以前的旧对象A的,所以是可行的