Mikä on funktionaalinen rajapinta?
On aika perehtyä tarkemmin siihen, miten lambda-lausekkeet luodaan Javassa ja mikä rooli funktionaalisilla rajapinnoilla on niiden yhteydessä.
Funktionaalista rajapintaa voidaan käyttää kuvaamaan toimintoa tai operaatiota, joka voidaan suorittaa. Kokonaisen luokan luomisen sijaan yksinkertaista tehtävää varten voidaan määritellä rajapinta, jossa on yksi metodi, joka kuvaa toiminnon.
Esimerkki funktionaalisesta rajapinnasta:
@FunctionalInterface
public interface MyFunctionalInterface {
void myMethod(); // The only abstract method
}
@FunctionalInterface-annotaatio on valinnainen, mutta se auttaa kääntäjää ja kehittäjiä varmistamaan, että rajapinta pysyy funktionaalisena ja estää useiden abstraktien metodien lisäämisen.
Miksi niitä tarvitaan?
Stream API:ssa funktionaalisia rajapintoja käytetään välittämään erilaisia toimintoja metodeihin, jotka käsittelevät datan kokoelmia.
Esimerkiksi voit välittää suodatusehdon metodille, joka valitsee tiettyjä alkioita listasta, tai antaa operaation, joka muuntaa jokaisen alkion, kuten filter()- ja map()-metodeissa.
Main.java
1234567891011121314151617package com.example; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6); // Using `filter()` to extract even numbers List<Integer> evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) // Predicate: keeps only even numbers .collect(Collectors.toList()); System.out.println(evenNumbers); } }
filter()-metodi käyttää erityistä funktionaalista rajapintaa nimeltä Predicate<T> (johon perehdyt myöhemmin), joka tarkistaa, täyttääkö alkio tietyn ehdon. Tässä tapauksessa lambda-lauseke n -> n % 2 == 0 määrittää, onko luku parillinen. Jos luku on jaollinen kahdella ilman jakojäännöstä, se säilyy virrassa.
Oman funktionaalisen rajapinnan luominen
Tarvittaessa rajapinta aritmeettisten operaatioiden, kuten yhteenlaskun tai vähennyslaskun, suorittamiseen.
Voit luoda funktionaalisen rajapinnan nimeltä ArithmeticOperation, jossa on metodi apply, joka suorittaa operaation kahdelle luvulle, a ja b.
@FunctionalInterface
public interface ArithmeticOperation {
int apply(int a, int b); // Method to perform an operation on two numbers
}
Nyt kun sinulla on rajapinta, voit käyttää lambda-lausekkeita määritelläksesi erilaisia operaatioita kuten yhteenlasku ja vähennyslasku:
Main.java
1234567891011public class Main { public static void main(String[] args) { // Addition ArithmeticOperation add = (a, b) -> a + b; System.out.println("Sum: " + add.apply(5, 3)); // 8 // Subtraction ArithmeticOperation subtract = (a, b) -> a - b; System.out.println("Difference: " + subtract.apply(5, 3)); // 2 } }
Lambda-lausekkeet (a, b) -> a + b ja (a, b) -> a - b toteuttavat rajapinnan apply-metodin, suorittaen vastaavasti yhteenlaskun ja vähennyksen. Ensimmäinen lambda-lauseke palauttaa kahden luvun summan, kun taas toinen palauttaa niiden erotuksen.
Tämä lähestymistapa tarjoaa joustavan tavan käyttää erilaisia aritmeettisia operaatioita ilman, että jokaiselle tarvitsee luoda erillistä luokkaa.
1. Mikä on funktionaalinen rajapinta Javassa?
2. Mikä lambda-lauseke toteuttaa oikein seuraavan funktionaalisen rajapinnan?
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
What are some examples of built-in functional interfaces in Java?
How do I use a lambda expression with a custom functional interface?
Can you explain how functional interfaces are used with the Stream API?
Awesome!
Completion rate improved to 2.33
Mikä on funktionaalinen rajapinta?
Pyyhkäise näyttääksesi valikon
On aika perehtyä tarkemmin siihen, miten lambda-lausekkeet luodaan Javassa ja mikä rooli funktionaalisilla rajapinnoilla on niiden yhteydessä.
Funktionaalista rajapintaa voidaan käyttää kuvaamaan toimintoa tai operaatiota, joka voidaan suorittaa. Kokonaisen luokan luomisen sijaan yksinkertaista tehtävää varten voidaan määritellä rajapinta, jossa on yksi metodi, joka kuvaa toiminnon.
Esimerkki funktionaalisesta rajapinnasta:
@FunctionalInterface
public interface MyFunctionalInterface {
void myMethod(); // The only abstract method
}
@FunctionalInterface-annotaatio on valinnainen, mutta se auttaa kääntäjää ja kehittäjiä varmistamaan, että rajapinta pysyy funktionaalisena ja estää useiden abstraktien metodien lisäämisen.
Miksi niitä tarvitaan?
Stream API:ssa funktionaalisia rajapintoja käytetään välittämään erilaisia toimintoja metodeihin, jotka käsittelevät datan kokoelmia.
Esimerkiksi voit välittää suodatusehdon metodille, joka valitsee tiettyjä alkioita listasta, tai antaa operaation, joka muuntaa jokaisen alkion, kuten filter()- ja map()-metodeissa.
Main.java
1234567891011121314151617package com.example; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6); // Using `filter()` to extract even numbers List<Integer> evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) // Predicate: keeps only even numbers .collect(Collectors.toList()); System.out.println(evenNumbers); } }
filter()-metodi käyttää erityistä funktionaalista rajapintaa nimeltä Predicate<T> (johon perehdyt myöhemmin), joka tarkistaa, täyttääkö alkio tietyn ehdon. Tässä tapauksessa lambda-lauseke n -> n % 2 == 0 määrittää, onko luku parillinen. Jos luku on jaollinen kahdella ilman jakojäännöstä, se säilyy virrassa.
Oman funktionaalisen rajapinnan luominen
Tarvittaessa rajapinta aritmeettisten operaatioiden, kuten yhteenlaskun tai vähennyslaskun, suorittamiseen.
Voit luoda funktionaalisen rajapinnan nimeltä ArithmeticOperation, jossa on metodi apply, joka suorittaa operaation kahdelle luvulle, a ja b.
@FunctionalInterface
public interface ArithmeticOperation {
int apply(int a, int b); // Method to perform an operation on two numbers
}
Nyt kun sinulla on rajapinta, voit käyttää lambda-lausekkeita määritelläksesi erilaisia operaatioita kuten yhteenlasku ja vähennyslasku:
Main.java
1234567891011public class Main { public static void main(String[] args) { // Addition ArithmeticOperation add = (a, b) -> a + b; System.out.println("Sum: " + add.apply(5, 3)); // 8 // Subtraction ArithmeticOperation subtract = (a, b) -> a - b; System.out.println("Difference: " + subtract.apply(5, 3)); // 2 } }
Lambda-lausekkeet (a, b) -> a + b ja (a, b) -> a - b toteuttavat rajapinnan apply-metodin, suorittaen vastaavasti yhteenlaskun ja vähennyksen. Ensimmäinen lambda-lauseke palauttaa kahden luvun summan, kun taas toinen palauttaa niiden erotuksen.
Tämä lähestymistapa tarjoaa joustavan tavan käyttää erilaisia aritmeettisia operaatioita ilman, että jokaiselle tarvitsee luoda erillistä luokkaa.
1. Mikä on funktionaalinen rajapinta Javassa?
2. Mikä lambda-lauseke toteuttaa oikein seuraavan funktionaalisen rajapinnan?
Kiitos palautteestasi!