0Pricing
Java Academy · Lekcja

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); // 2

Statyczna 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)); // 30

Sortowanie 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, Charlie

Kiedy 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.0

Szybkie 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

  1. Odwołania do metod statycznych
  2. Odwołania do metod instancji konkretnego obiektu
  3. Odwołania do metod dowolnej instancji
  4. Odwołania do konstruktorów
← Powrót do Java Academy