Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Funktionaalisten Rajapintojen Bi-Versiot | Stream API:n Perusteet ja Toiminnalliset Ominaisuudet
Stream API

bookFunktionaalisten Rajapintojen Bi-Versiot

Javassa on useita funktionaalisten rajapintojen bi-versioita, jotka toimivat kahden argumentin kanssa. Nämä rajapinnat tarjoavat käteviä malleja erilaisten operaatioiden suorittamiseen syöteparilla, oli kyseessä sitten tuloksen laskeminen, toiminnon suorittaminen tai ehdon tarkistaminen.

Ne yksinkertaistavat käsittelyä monimutkaisissa tilanteissa, joissa täytyy työskennellä kahden parametrin kanssa samanaikaisesti.

Esimerkiksi, sen sijaan että kirjoittaisit monimutkaista koodia useilla sisäkkäisillä kutsuilla, voit hyödyntää ytimekkäitä rajapintoja, jotka tarjoavat valmiita metodeja keskeisten toimintojen toteuttamiseen.

BiFunction<T, U, R>

BiFunction on funktionaalinen rajapinta, joka ottaa kaksi syöteparametria tyypeistä T ja U ja palauttaa tuloksen tyyppiä R.

@FunctionalInterface
public interface BiFunction<T, U, R> {
    R apply(T t, U u);
}

BiFunction on ihanteellinen tilanteisiin, joissa täytyy käsitellä kahta arvoa ja palauttaa johdettu tulos, kuten laskenta, muunnos tai datan yhdistäminen.

Esimerkiksi, jos täytyy laskea varastossa olevien tuotteiden kokonaiskustannus kertomalla määrä ja yksikköhinta:

Main.java

Main.java

copy
1234567891011121314151617
package com.example; import java.util.function.BiFunction; public class Main { public static void main(String[] args) { // `BiFunction` to calculate total cost BiFunction<Integer, Double, Double> calculateTotalCost = (quantity, pricePerUnit) -> quantity * pricePerUnit; // Example usage int quantity = 50; double pricePerUnit = 19.99; double totalCost = calculateTotalCost.apply(quantity, pricePerUnit); System.out.println("Total cost: $" + totalCost); } }

Tässä esimerkissä BiFunction<Integer, Double, Double> ottaa vastaan kaksi argumenttia: quantity ja pricePerUnit (yksikköhinta), ja palauttaa tuloksenkokonaiskustannuksen Double-arvona. apply()-metodi suorittaa määritellyn operaation, yhdistäen funktionaalisen rajapinnan kertolaskulogiikkaan.

BiConsumer<T, U>

BiConsumer on funktionaalinen rajapinta, joka ottaa vastaan kaksi argumenttia tyypeistä T ja U, mutta ei palauta tulosta.

@FunctionalInterface
public interface BiConsumer<T, U> {
    void accept(T t, U u);
}

Käytetään toimintojen suorittamiseen kahdelle objektille, kuten lokitietojen kirjaamiseen, tietojen näyttämiseen tai datan tallentamiseen.

Esimerkiksi luodaan funktionaalinen rajapinta, joka ottaa vastaan työntekijän nimen ja palkan, muotoilee tiedot ja tulostaa ne konsoliin:

Main.java

Main.java

copy
1234567891011121314151617181920212223242526
package com.example; import java.util.HashMap; import java.util.Map; import java.util.function.BiConsumer; public class Main { public static void main(String[] args) { // `BiConsumer` for formatted output of employee details BiConsumer<String, Double> printEmployeeDetails = (name, salary) -> { System.out.printf("Employee: %-15s | Salary: $%.2f%n", name, salary); }; // Collection of employees with their salaries Map<String, Double> employeeData = new HashMap<>(); employeeData.put("John Smith", 75000.0); employeeData.put("Mary Johnson", 82000.0); employeeData.put("Robert Brown", 64000.0); employeeData.put("Emily Davis", 91000.0); // Print details of each employee System.out.println("Employee Salary Report:"); System.out.println("-----------------------------------"); employeeData.forEach(printEmployeeDetails); } }

Tässä esimerkissä BiConsumer<String, Double> käytetään käsittelemään työntekijän nimeä ja palkkaa, tulostaen tiedot konsoliin muotoillulla tavalla.

forEach()-kokoelman Map-metodi välittää jokaisen avain-arvo-parin BiConsumer, joka suorittaa määritellyn toiminnon kaikille työntekijöille.

BiPredicate<T, U>

BiPredicate on funktionaalinen rajapinta, joka ottaa kaksi argumenttia tyypeistä T ja U ja palauttaa boolean-arvon.

@FunctionalInterface
public interface BiPredicate<T, U> {
    boolean test(T t, U u);
}

Sitä käytetään ehtojen tarkistamiseen, joissa tuloksena on boolean-arvo (true tai false), perustuen kahden syötearvon analyysiin.

Esimerkiksi tarkistetaan, onko merkkijonon pituus suurempi kuin annettu luku:

Main.java

Main.java

copy
1234567891011121314151617
package com.example; import java.util.function.BiPredicate; public class Main { public static void main(String[] args) { // `BiPredicate` to check if string length is greater than given number BiPredicate<String, Integer> isStringLongerThan = (str, length) -> str.length() > length; // Example usage String text = "Sample string"; int minLength = 10; boolean result = isStringLongerThan.test(text, minLength); System.out.println("String is longer than " + minLength + " characters: " + result); } }

Tässä esimerkissä BiPredicate<String, Integer> ottaa vastaan kaksi argumenttia: merkkijonon str ja luvun length, joka edustaa vähimmäispituutta. test()-metodi tarkistaa ehdon ja palauttaa true, jos merkkijonon pituus on suurempi kuin määritetty luku, tai muuten false.

1. Mikä metodi on pääasiallinen BiFunction<T, U, R>-rajapinnassa?

2. Mitä accept(T t, U u) -metodi BiConsumer<T, U> -rajapinnassa palauttaa?

3. Mitä rajapintaa käytetään loogisen ehdon tarkistamiseen kahdella argumentilla?

question mark

Mikä metodi on pääasiallinen BiFunction<T, U, R>-rajapinnassa?

Select the correct answer

question mark

Mitä accept(T t, U u) -metodi BiConsumer<T, U> -rajapinnassa palauttaa?

Select the correct answer

question mark

Mitä rajapintaa käytetään loogisen ehdon tarkistamiseen kahdella argumentilla?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 13

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Suggested prompts:

Can you give examples of how to use these bi-functional interfaces in Java?

What are some common use cases for BiFunction, BiConsumer, and BiPredicate?

How do these bi-interfaces differ from their single-argument counterparts?

Awesome!

Completion rate improved to 2.33

bookFunktionaalisten Rajapintojen Bi-Versiot

Pyyhkäise näyttääksesi valikon

Javassa on useita funktionaalisten rajapintojen bi-versioita, jotka toimivat kahden argumentin kanssa. Nämä rajapinnat tarjoavat käteviä malleja erilaisten operaatioiden suorittamiseen syöteparilla, oli kyseessä sitten tuloksen laskeminen, toiminnon suorittaminen tai ehdon tarkistaminen.

Ne yksinkertaistavat käsittelyä monimutkaisissa tilanteissa, joissa täytyy työskennellä kahden parametrin kanssa samanaikaisesti.

Esimerkiksi, sen sijaan että kirjoittaisit monimutkaista koodia useilla sisäkkäisillä kutsuilla, voit hyödyntää ytimekkäitä rajapintoja, jotka tarjoavat valmiita metodeja keskeisten toimintojen toteuttamiseen.

BiFunction<T, U, R>

BiFunction on funktionaalinen rajapinta, joka ottaa kaksi syöteparametria tyypeistä T ja U ja palauttaa tuloksen tyyppiä R.

@FunctionalInterface
public interface BiFunction<T, U, R> {
    R apply(T t, U u);
}

BiFunction on ihanteellinen tilanteisiin, joissa täytyy käsitellä kahta arvoa ja palauttaa johdettu tulos, kuten laskenta, muunnos tai datan yhdistäminen.

Esimerkiksi, jos täytyy laskea varastossa olevien tuotteiden kokonaiskustannus kertomalla määrä ja yksikköhinta:

Main.java

Main.java

copy
1234567891011121314151617
package com.example; import java.util.function.BiFunction; public class Main { public static void main(String[] args) { // `BiFunction` to calculate total cost BiFunction<Integer, Double, Double> calculateTotalCost = (quantity, pricePerUnit) -> quantity * pricePerUnit; // Example usage int quantity = 50; double pricePerUnit = 19.99; double totalCost = calculateTotalCost.apply(quantity, pricePerUnit); System.out.println("Total cost: $" + totalCost); } }

Tässä esimerkissä BiFunction<Integer, Double, Double> ottaa vastaan kaksi argumenttia: quantity ja pricePerUnit (yksikköhinta), ja palauttaa tuloksenkokonaiskustannuksen Double-arvona. apply()-metodi suorittaa määritellyn operaation, yhdistäen funktionaalisen rajapinnan kertolaskulogiikkaan.

BiConsumer<T, U>

BiConsumer on funktionaalinen rajapinta, joka ottaa vastaan kaksi argumenttia tyypeistä T ja U, mutta ei palauta tulosta.

@FunctionalInterface
public interface BiConsumer<T, U> {
    void accept(T t, U u);
}

Käytetään toimintojen suorittamiseen kahdelle objektille, kuten lokitietojen kirjaamiseen, tietojen näyttämiseen tai datan tallentamiseen.

Esimerkiksi luodaan funktionaalinen rajapinta, joka ottaa vastaan työntekijän nimen ja palkan, muotoilee tiedot ja tulostaa ne konsoliin:

Main.java

Main.java

copy
1234567891011121314151617181920212223242526
package com.example; import java.util.HashMap; import java.util.Map; import java.util.function.BiConsumer; public class Main { public static void main(String[] args) { // `BiConsumer` for formatted output of employee details BiConsumer<String, Double> printEmployeeDetails = (name, salary) -> { System.out.printf("Employee: %-15s | Salary: $%.2f%n", name, salary); }; // Collection of employees with their salaries Map<String, Double> employeeData = new HashMap<>(); employeeData.put("John Smith", 75000.0); employeeData.put("Mary Johnson", 82000.0); employeeData.put("Robert Brown", 64000.0); employeeData.put("Emily Davis", 91000.0); // Print details of each employee System.out.println("Employee Salary Report:"); System.out.println("-----------------------------------"); employeeData.forEach(printEmployeeDetails); } }

Tässä esimerkissä BiConsumer<String, Double> käytetään käsittelemään työntekijän nimeä ja palkkaa, tulostaen tiedot konsoliin muotoillulla tavalla.

forEach()-kokoelman Map-metodi välittää jokaisen avain-arvo-parin BiConsumer, joka suorittaa määritellyn toiminnon kaikille työntekijöille.

BiPredicate<T, U>

BiPredicate on funktionaalinen rajapinta, joka ottaa kaksi argumenttia tyypeistä T ja U ja palauttaa boolean-arvon.

@FunctionalInterface
public interface BiPredicate<T, U> {
    boolean test(T t, U u);
}

Sitä käytetään ehtojen tarkistamiseen, joissa tuloksena on boolean-arvo (true tai false), perustuen kahden syötearvon analyysiin.

Esimerkiksi tarkistetaan, onko merkkijonon pituus suurempi kuin annettu luku:

Main.java

Main.java

copy
1234567891011121314151617
package com.example; import java.util.function.BiPredicate; public class Main { public static void main(String[] args) { // `BiPredicate` to check if string length is greater than given number BiPredicate<String, Integer> isStringLongerThan = (str, length) -> str.length() > length; // Example usage String text = "Sample string"; int minLength = 10; boolean result = isStringLongerThan.test(text, minLength); System.out.println("String is longer than " + minLength + " characters: " + result); } }

Tässä esimerkissä BiPredicate<String, Integer> ottaa vastaan kaksi argumenttia: merkkijonon str ja luvun length, joka edustaa vähimmäispituutta. test()-metodi tarkistaa ehdon ja palauttaa true, jos merkkijonon pituus on suurempi kuin määritetty luku, tai muuten false.

1. Mikä metodi on pääasiallinen BiFunction<T, U, R>-rajapinnassa?

2. Mitä accept(T t, U u) -metodi BiConsumer<T, U> -rajapinnassa palauttaa?

3. Mitä rajapintaa käytetään loogisen ehdon tarkistamiseen kahdella argumentilla?

question mark

Mikä metodi on pääasiallinen BiFunction<T, U, R>-rajapinnassa?

Select the correct answer

question mark

Mitä accept(T t, U u) -metodi BiConsumer<T, U> -rajapinnassa palauttaa?

Select the correct answer

question mark

Mitä rajapintaa käytetään loogisen ehdon tarkistamiseen kahdella argumentilla?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 13
some-alt