java negate_java8 Predicate接口中的negate()默认方法用java7如何实现?

a7007d695175646cf267e9fd0fc9228e.png

撒科打诨

首先给出我认为的正确写法吧(我copy了Predicat类,然后改名为PredicateExt进行重写)default PredicateExt negate() {

        PredicateExt predicate = this;

        PredicateExt otherPredicate = new PredicateExt() {  

                  @Override

            public boolean test(T t) {  

                          return !predicate.test(t);

            }

        };        return otherPredicate;

    }再来看看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的,所以是可行的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值