2015-05-08 12 views
5

JLS 15.13 lists examples von Methodenreferenzausdrücken. Einer von ihnen istMethode Referenzbeispiel in JLS

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

, die keinen Sinn macht, da replaceAllvoid ist. Missverständnis ich etwas oder ist das ein Fehler in JLS (vielleicht hat eine frühere Version von replaceAll die resultierende Liste zurückgegeben)?

+3

Ja, das sieht total wie ein Fehler aus. –

Antwort

3

Nun, technisch ist es nicht in JLS angegeben, dass die list Variable java.util.List Typ hat. So kann dieser Code mit einigen benutzerdefinierten Typ kompiliert werden:

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; 
} 

Aber im Allgemeinen sieht es aus wie sie beabsichtigt, ein Exempel zu statuieren, basierend auf java.util.List. Daher wäre es wahrscheinlich am besten, sie durch etwas JDK-basiertes zu ersetzen.