2014-11-19 5 views

Odpowiedz

19

To odwołanie do metody. Dodano w języku Java 8.

TreeSet::new odnosi się do domyślnego konstruktora z TreeSet.

Ogólnie rzecz biorąc A::B odnosi się do metody B w klasie A.

+2

+1 o czym będą myśleć dalej? Przełączanie sznurów być może ... Interfejsy z metodami ... – Bathsheba

+2

@ Batszaba, przeciskam palce, by przeciążać operatora. – ChiefTwoPencils

+2

@ChiefTwoPencils Zwłaszcza jeśli definiują one również ',' jako operator. –

8

:: nazywane jest odniesieniem do metody. Jest to w zasadzie odniesienie do jednej metody. tj. odnosi się do istniejącej metody po nazwie.

Method reference using :: jest operatorem wygoda.

Odniesienie do metody jest jedną z funkcji należących do Java lambda expressions. Odniesienie do metody można wyrazić przy użyciu zwykłego formatu składni ekspresji lambda, używając –>. Aby uczynić go prostszym, można użyć operatora.

Przykład:

public class MethodReferenceExample { 
    void close() { 
     System.out.println("Close."); 
    } 

    public static void main(String[] args) throws Exception { 
     MethodReferenceExample referenceObj = new MethodReferenceExample(); 
     try (AutoCloseable ac = referenceObj::close) { 
     } 
    } 
} 

Więc W przykładzie:

Set<String> set = people.stream() 
         .map(Person::getName) 
         .collect(Collectors.toCollection(TreeSet::new)); 

dzwoni/stworzenie 'nowego' TreeSet.

Podobny przykład Contstructor referencyjny to:

class Zoo { 
    private List animalList; 
    public Zoo(List animalList) { 
     this.animalList = animalList; 
     System.out.println("Zoo created."); 
    } 
} 

interface ZooFactory { 
    Zoo getZoo(List animals); 
} 

public class ConstructorReferenceExample { 

    public static void main(String[] args) { 
     //following commented line is lambda expression equivalent 
     //ZooFactory zooFactory = (List animalList)-> {return new Zoo(animalList);};  
     ZooFactory zooFactory = Zoo::new; 
     System.out.println("Ok");  
     Zoo zoo = zooFactory.getZoo(new ArrayList()); 
    } 
} 
4

Person :: getName w tym kontekście jest skrótem (Person p) -> p.getName()

Zobacz więcej przykładów oraz szczegółowy wyjaśnienia w JLS section 15.13