Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Mikä on Funktionaalinen Rajapinta? | Osio
Stream API Javassa

bookMikä 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

Main.java

copy
1234567891011121314151617
package 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

Main.java

copy
1234567891011
public 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?

question mark

Mikä on funktionaalinen rajapinta Javassa?

Select the correct answer

question mark

Mikä lambda-lauseke toteuttaa oikein seuraavan funktionaalisen rajapinnan?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 3

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

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

Osio 1. Luku 3
some-alt