Staattiset metodiviittaukset
Korvaa staattisia metodeja kutsuvat lambdat ClassName::methodName-viittauksilla.
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); // 2Comparatorin 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)); // 30Lajittelu 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, CharlieMilloin 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.0Pikatarkistus
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
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
- Staattiset metodiviittaukset
- Metodiviittaukset tietyn instanssin metodeihin
- Mielivaltaisen instanssin metodiviittaukset
- Konstruktoriviittaukset