Zielony Smok - logo witryny

Nowy operator ::

W Javie 8 obok operatora -> wprowadzono operator ::
pozwalający na skrótowe odnoszenie się do metod i konstruktorów. Operator oddziela
nazwę klasy albo obiektu od nazwy metody.

Referencje do metod

Referencje do metod instancji

Używamy konstrukcji obiekt::metoda.

Referencje do metod klasy

Używamy konstrukcji Klasa::metoda.

Referencje do metod statycznych

Używamy konstrukcji Klasa::metoda.

Referencje do metod nadklasy przy przeciążeniu metod

Używamy konstrukcji super::metoda.

Referencje do konstruktorów

Referencje do konstruktora zwykłego

Używamy konstrukcji Klasa::new.

Referencje do konstruktora z typem ogólnym

Używamy konstrukcji Klasa<Typ>::new.

Referencje do konstruktora tablicy

Używamy konstrukcji Klasa[]::new.

Przykład

Załóżmy, że chcemy przekszałcić strumień stringów, tak aby elementy były zapisane wielkimi literami. Dla każdego elementu musimy zastosować metodę klasy String toUpperCase(). Funkcję mapującą możemy zapisać w następujący sposób:

map((String s) -> {return s.toUpperCase();})

albo krócej

map(s -> s.toUpperCase())

albo używając referencji do metody, która jest skrótowym zapisaniem wyrażenia lambda:

map(String::toUpperCase)

gdzie znak :: oznacza referencję do metody.

Referencja do metody pozwala również na użycie metod statycznych.

String[] values = {"Halina", "Bogusław", "Maria", "Piotr",
"Anatol", "Jacek", "Alfred", "Elżbieta", "Antoni", "Bartłomiej",
"Dominika", "Łucja", "Cyryl", "Metody", "Prokop", "Mikołaj",
"Amelia", "Filip", "Olga"};

//stara metoda
for(int i = 0; i <values.length; i++){
   values[i] = values[i].toUpperCase();
   System.out.print(values[i] + " ");
}
System.out.println();
//nowa metoda

//1
Arrays.stream(values).map((String s) -> {
	return s.toUpperCase();
}).forEach(value -> System.out.print(value + " "));
        System.out.println();

//2
Arrays.stream(values).map(s -> s.toUpperCase())
.forEach(value -> System.out.print(value + " "));
System.out.println();

//3
Arrays.stream(values).map(String::toUpperCase)
.forEach(value -> System.out.print(value + " "));

Po uruchomieniu klasy na konsoli zobaczymy w każdym przypadku:

HALINA BOGUSŁAW MARIA PIOTR ANATOL JACEK
ALFRED ELŻBIETA ANTONI BARTŁOMIEJ DOMINIKA
ŁUCJA CYRYL METODY PROKOP MIKOŁAJ AMELIA
FILIP OLGA