Java Academy · Oppitunti

Staattiset metodiviittaukset

Korvaa staattisia metodeja kutsuvat lambdat ClassName::methodName-viittauksilla.

Oppitunti 1/413 vaihetta

Staattiset metodiviittaukset on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä metodiviittaukset ovat?

Metodiviittaus on lyhyt lambda-lauseke, joka delegoi kutsun olemassa olevalle metodille. Kun lambda vain kutsuisi yhtä metodia, metodiviittaus on selkeämpi ja helpommin luettava.

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

Staattisen metodiviittauksen syntaksi

Staattinen metodiviittaus on muotoa ClassName::staticMethodName. Sitä voidaan käyttää kaikkialla, missä funktionaalinen rajapinta odottaa saman allekirjoituksen mukaista metodia.

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 metodiviittauksena

Utility-luokkien, kuten Math-luokan, staattisiin metodeihin voidaan viitata suoraan:

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]

Staattinen metodiviittaus Predicaten kanssa

Totuusarvon palauttavat staattiset metodit voivat toimia Predicate-rajapinnan kanssa:

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

Comparatorin staattinen viittaus

Myös Comparator-rajapinnan kanssa yhteensopiviin staattisiin metodeihin voidaan viitata:

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]

Mukautettu staattinen apumetodi

Määrittäkää staattinen utility-metodi ja viitatkaa siihen suoraan:

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 staattisen metodin kanssa

Kaksi parametria ottavat staattiset metodit voivat vastata tyyppiä 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

Lajittelu Comparator.comparing-metodilla ja staattisella viittauksella

Yhdistäkää Comparator.comparing metodiviittauksiin selkeää lajittelua varten:

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

Milloin staattisia metodiviittauksia kannattaa käyttää

Käyttäkää staattisia metodiviittauksia, kun:

  • lambdan runko on yksi staattisen metodin kutsu
  • argumentteja ei tarvitse muuntaa
  • metodin allekirjoitus vastaa funktionaalista rajapintaa

Jos argumentteja on muunnettava tai tarvitaan lisälogiikkaa, käyttäkää lambda-lauseketta.

Luettavuuden vertailu

Lambda- ja metodiviittaustyylien rinnakkainen vertailu:

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

Yleinen sudenkuoppa: väärä allekirjoitus

Metodiviittaus toimii vain, jos sen allekirjoitus vastaa täsmälleen funktionaalisen rajapinnan abstraktia metodia. Jos argumenttien tyypit tai lukumäärä eroavat, käyttäkää sen sijaan lambda-käärettä.

// 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

Pikatarkistus

Mikä seuraavista on kelvollinen staattinen metodiviittaus, joka toimii Predicate<Object>-tyypin kanssa?

Kertaus: staattiset metodiviittaukset

Keskeiset opit:

  • Syntaksi: ClassName::staticMethodName
  • Korvaa lambdat, jotka delegoivat kutsun yhdelle staattiselle metodille
  • Metodin allekirjoituksen on vastattava funktionaalisen rajapinnan abstraktia metodia
  • Toimii esimerkiksi Predicate-, Function-, Consumer- ja Comparator-rajapintojen kanssa
  • Käyttäkää lambda-lausekkeita, kun argumentteja on muunnettava tai tarvitaan lisälogiikkaa
Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”Staattiset metodiviittaukset” ilmainen?

Kyllä – oppitunnin ”Staattiset metodiviittaukset” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Staattiset metodiviittaukset”?

Korvaa staattisia metodeja kutsuvat lambdat ClassName::methodName-viittauksilla. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Staattiset metodiviittaukset”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?

Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Staattiset metodiviittaukset
  2. Metodiviittaukset tietyn instanssin metodeihin
  3. Mielivaltaisen instanssin metodiviittaukset
  4. Konstruktoriviittaukset
← Takaisin: Java Academy