Odwołania do metod statycznych
Zastępuj lambdy wywołujące metody statyczne odwołaniami ClassName::methodName.
Odwołania do metod statycznych to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.
Czym są referencje do metod?
Referencja do metody to skrócona lambda, która deleguje wywołanie do istniejącej metody. Jeśli lambda wywołuje tylko jedną metodę, referencja do metody jest przejrzystszym i czytelniejszym rozwiązaniem.
import java.util.*;
import java.util.stream.*;
List<String> names = List.of("Alice", "Bob", "Carol");
// Lambda:
names.forEach(s -> System.out.println(s));
// Equivalent method reference:
names.forEach(System.out::println);Składnia referencji do metody statycznej
Referencja do metody statycznej ma postać ClassName::staticMethodName. Można jej użyć wszędzie tam, gdzie interfejs funkcyjny oczekuje metody o takim samym podpisie.
import java.util.stream.*;
// Integer.parseInt(String) matches Function<String, Integer>
List<String> strs = List.of("1","2","3","4","5");
List<Integer> nums = strs.stream()
.map(Integer::parseInt) // replaces s -> Integer.parseInt(s)
.collect(Collectors.toList());
System.out.println(nums); // [1, 2, 3, 4, 5]Math.abs jako referencja do metody
Do metod statycznych z klas narzędziowych, takich jak Math, można odwoływać się bezpośrednio:
import java.util.*;
import java.util.stream.*;
List<Integer> values = List.of(-3, 5, -1, 8, -4);
List<Integer> abs = values.stream()
.map(Math::abs) // replaces v -> Math.abs(v)
.collect(Collectors.toList());
System.out.println(abs); // [3, 5, 1, 8, 4]Referencja do metody statycznej z Predicate
Metody statyczne zwracające wartość logiczną mogą służyć jako Predicate:
import java.util.stream.*;
// String.isEmpty() is an instance method, but we can use a static helper
// Objects.isNull matches Predicate<Object>
List<String> mixed = Arrays.asList("hello", null, "world", null);
long nullCount = mixed.stream()
.filter(Objects::isNull)
.count();
System.out.println(nullCount); // 2
long nonNull = mixed.stream()
.filter(Objects::nonNull)
.count();
System.out.println(nonNull); // 2Statyczna referencja komparatora
Można również odwoływać się do metod statycznych pasujących do Comparator:
import java.util.*;
import java.util.stream.*;
List<String> words = List.of("banana", "apple", "cherry");
// String.CASE_INSENSITIVE_ORDER is a Comparator
List<String> sorted = words.stream()
.sorted(String::compareToIgnoreCase)
.collect(Collectors.toList());
System.out.println(sorted); // [apple, banana, cherry]Własna pomocnicza metoda statyczna
Zdefiniuj statyczną metodę narzędziową i odwołaj się do niej bezpośrednio:
class Validator {
static boolean isPositive(int n) { return n > 0; }
static String toLabel(int n) { return n > 0 ? "POS" : "NEG"; }
}
List<Integer> nums = List.of(-2, 3, -1, 5, 0);
List<Integer> positive = nums.stream()
.filter(Validator::isPositive)
.collect(Collectors.toList());
System.out.println(positive); // [3, 5]
List<String> labels = nums.stream()
.map(Validator::toLabel)
.collect(Collectors.toList());BiFunction z metodą statyczną
Metody statyczne przyjmujące dwa parametry mogą pasować do BiFunction<T,U,R>:
import java.util.function.*;
// Math.max(int,int) → BiFunction... but needs IntBinaryOperator
java.util.function.IntBinaryOperator maxOp = Math::max;
System.out.println(maxOp.applyAsInt(7, 3)); // 7
// String.format as BiFunction? Only works if signature matches:
// Integer.sum(int,int) → IntBinaryOperator
java.util.function.IntBinaryOperator sum = Integer::sum;
System.out.println(sum.applyAsInt(10, 20)); // 30Sortowanie z Comparator.comparing i referencją statyczną
Połącz Comparator.comparing z referencjami do metod, aby uzyskać przejrzyste sortowanie:
record Person(String name, int age) {}
List<Person> people = List.of(
new Person("Charlie",30), new Person("Alice",25), new Person("Bob",35)
);
people.stream()
.sorted(Comparator.comparing(Person::name))
.forEach(p -> System.out.println(p.name()));
// Alice, Bob, CharlieKiedy używać referencji do metod statycznych
Używaj referencji do metod statycznych, gdy:
- ciało lambdy jest pojedynczym wywołaniem metody statycznej
- nie trzeba przekształcać argumentów
- podpis metody pasuje do interfejsu funkcyjnego
Jeśli trzeba przekształcić argumenty albo dodać logikę, użyj lambdy.
Porównanie czytelności
Porównanie obok siebie stylu lambdy i referencji do metody:
// Lambda style
Stream.of("1","2","3").map(s -> Integer.parseInt(s));
Stream.of(1,-2,3).filter(n -> n > 0);
Stream.of(-5,2,-1).map(n -> Math.abs(n));
// Method reference style
Stream.of("1","2","3").map(Integer::parseInt);
Stream.of(1,-2,3).filter(Validator::isPositive);
Stream.of(-5,2,-1).map(Math::abs);Częsta pułapka: niewłaściwy podpis
Referencja do metody działa tylko wtedy, gdy jej podpis dokładnie pasuje do abstrakcyjnej metody interfejsu funkcyjnego. Jeśli typy lub liczba argumentów się różnią, użyj zamiast niej opakowującej lambdy.
// Math.pow(double, double) needs two args — can't use as Function<Double, Double>
// This won't compile:
// Function<Double, Double> square = Math::pow; // ERROR
// Fix with lambda:
Function<Double, Double> square = n -> Math.pow(n, 2);
System.out.println(square.apply(5.0)); // 25.0Szybkie sprawdzenie
Która z poniższych referencji do metody statycznej jest poprawna i działa jako Predicate<Object>?
Podsumowanie: referencje do metod statycznych
Najważniejsze informacje:
- Składnia: ClassName::staticMethodName
- Zastępują lambdy delegujące wywołanie do pojedynczej metody statycznej
- Podpis metody musi pasować do abstrakcyjnej metody interfejsu funkcyjnego
- Działają z Predicate, Function, Consumer, Comparator itd.
- Używaj lambd, gdy potrzebne jest przekształcenie argumentów lub dodatkowa logika
Często zadawane pytania
Czy lekcja „Odwołania do metod statycznych” jest bezpłatna?
Tak — pełny tekst „Odwołania do metod statycznych” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Odwołania do metod statycznych”?
Zastępuj lambdy wywołujące metody statyczne odwołaniami ClassName::methodName. Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Java Academy?
Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Odwołania do metod statycznych”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?
Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Odwołania do metod statycznych
- Odwołania do metod instancji konkretnego obiektu
- Odwołania do metod dowolnej instancji
- Odwołania do konstruktorów