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 niissä.
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 tietokokoelmia.
Esimerkiksi voit välittää suodatusehdon metodiin, joka valitsee tiettyjä alkioita listasta, tai antaa operaation, jolla muunnetaan jokaista alkiota, 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); } }
Metodi filter() ottaa erityisen funktionaalisen rajapinnan 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 jää virtaan.
Oman funktionaalisen rajapinnan luominen
Oletetaan, että tarvitset rajapinnan suorittamaan aritmeettisia operaatioita kuten yhteenlasku tai vähennyslasku.
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 käytettävissä on rajapinta, voidaan käyttää lambda-lausekkeita erilaisten operaatioiden kuten yhteenlaskun ja vähennyksen määrittelyyn:
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 tarvetta luoda erillisiä luokkia jokaiselle operaatiolle.
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