2015-05-08 28 views
5

JLS 15.13 lists examples di espressioni di riferimento del metodo. Uno di loro èEsempio di riferimento del metodo in JLS

(test ? list.replaceAll(String::trim) : list) :: iterator

, che non ha senso in quanto è replaceAllvoid. Sto fraintendendo qualcosa o si tratta di un errore in JLS (forse una versione precedente di replaceAll ha restituito l'elenco risultante)?

+3

Sì, sembra proprio un insetto. –

risposta

3

Bene, tecnicamente non è specificato in JLS che la variabile list ha il tipo java.util.List. Quindi, questo codice può essere compilato con un certo tipo personalizzato:

public static class MyList implements Iterable<String> { 
    private final List<String> list = new ArrayList<>(); 

    public MyList add(String val) { 
     list.add(val); 
     return this; 
    } 

    public MyList replaceAll(UnaryOperator<String> op) { 
     list.replaceAll(op); 
     return this; 
    } 

    public Iterator<String> iterator() { 
     return list.iterator(); 
    } 
} 

public Supplier<Iterator<String>> it(MyList list, boolean test) { 
    return (test ? list.replaceAll(String::trim) : list) :: iterator; 
} 

Ma in generale sembra che avevano intenzione di fare un esempio basato su java.util.List. Quindi probabilmente sarebbe meglio sostituirlo con qualcosa basato su JDK.