• <small id="ck0wk"><meter id="ck0wk"><menuitem id="ck0wk"></menuitem></meter></small>

  • <big id="ck0wk"></big>

  • 鍍金池/ 問答/Java  Python  網絡安全/ java8 Predicate接口中的negate()默認方法用java7如何實

    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()就成了死循環了啊,是我理解的不對嗎?正確的轉換是什么,請大家多多指教

    回答
    編輯回答
    若相惜

    首先給出我認為的正確寫法吧(我copy了Predicat類,然后改名為PredicateExt進行重寫)

    default PredicateExt<T> negate() {
            PredicateExt<T> predicate = this;
            PredicateExt<T> otherPredicate = new PredicateExt<T>() {
                @Override
                public boolean test(T t) {
                    return !predicate.test(t);
                }
            };
            return otherPredicate;
        }

    再來看看Java8中Predicate.negate到底表達的是什么意思

    1. Predicate肯定是一個類,(t) -> !test(t)這種lamdba語法也只是表示Predicate的一個對象而已
    2. default方法就是代表了Predicate對象的某個實例方法

    因此結合以上兩點,可以直接看出Predicate.negate代表Predicate的某個對象A執行時,根據A的執行結果再次創建了一個新Predicate的對象B
    所以,要換種方式來表示Predicate.negate方法,肯定也要體現出A,B兩個新舊對象,并且該方法的執行結果是根據A的執行結果體現出來的

    再來說說題主為什么會死循環,雖然題主已經明顯new了一個Predicate對象,這里體現了A,B兩個新舊對象,但是后面的執行結果并沒有體現出是根據A的執行結果來產生B的
    主要在于里面的在重寫B的test方法時,是再調用test方法的,只是前面加了一個!,所以顯然這里調用的是B的Predicatetest方法,當然就是循環調用了,可別指望它能調用A的Predicate方法,因為你正在重寫這個新Predicate的方法,這里的this指針,肯定是指向B的

    鑒于此,既然在B里面重寫方法時this指針是指向B的,那就在外面顯示的把A的對象指示出來,然后再B中重寫時,顯示用的A的方法進行執行,這樣就可以了,所以才有上面的寫法

    從運行的debug來看,以前的方式和現在重寫的方式,在新的B對象中,都包含了以前的舊對象A的,所以是可行的

    clipboard.png

    2017年6月26日 23:17
    男生女生一起差差差带痛声,插曲的痛的视频30分钟,男生和女生在一起差差的视频