Hva er et funksjonelt grensesnitt?
Det er på tide å gå i dybden på hvordan lambdas opprettes i Java og hvilken rolle funksjonelle grensesnitt spiller i denne prosessen.
Et funksjonelt grensesnitt kan brukes til å representere en handling eller operasjon som kan utføres. I stedet for å opprette en hel klasse for en enkel oppgave, kan du definere et grensesnitt med én metode som beskriver handlingen.
Eksempel på et funksjonelt grensesnitt:
@FunctionalInterface
public interface MyFunctionalInterface {
void myMethod(); // The only abstract method
}
Annotasjonen @FunctionalInterface er valgfri, men den hjelper kompilatoren og utviklere ved å sikre at grensesnittet forblir funksjonelt og forhindrer at det legges til flere abstrakte metoder.
Hvorfor trenger vi dem?
I Stream API brukes funksjonelle grensesnitt for å sende ulike oppførsler inn i metoder som arbeider med datasamlinger.
For eksempel kan du sende en filtreringsbetingelse til en metode som velger bestemte elementer fra en liste, eller angi en operasjon for å transformere hvert element, slik det gjøres i metoder som filter() og map().
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); } }
Metoden filter() tar et spesielt funksjonelt grensesnitt kalt Predicate<T> (som du vil lære mer om senere), som sjekker om et element oppfyller en bestemt betingelse. I dette tilfellet avgjør lambda-uttrykket n -> n % 2 == 0 om et tall er partall. Hvis tallet er delelig med 2 uten rest, forblir det i strømmen.
Lage et egendefinert funksjonelt grensesnitt
Anta at du trenger et grensesnitt for å utføre aritmetiske operasjoner som addisjon eller subtraksjon.
Du kan lage et funksjonelt grensesnitt kalt ArithmeticOperation med en metode apply som utfører en operasjon på to tall, a og b.
@FunctionalInterface
public interface ArithmeticOperation {
int apply(int a, int b); // Method to perform an operation on two numbers
}
Nå som du har grensesnittet, kan du bruke lambda-uttrykk til å definere ulike operasjoner som addisjon og subtraksjon:
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-uttrykkene (a, b) -> a + b og (a, b) -> a - b implementerer metoden apply i grensesnittet, og utfører henholdsvis addisjon og subtraksjon. Det første lambda-uttrykket returnerer summen av to tall, mens det andre returnerer differansen.
Denne tilnærmingen gir en fleksibel måte å bruke ulike aritmetiske operasjoner uten behov for å opprette egne klasser for hver enkelt.
1. Hva er et funksjonelt grensesnitt i Java?
2. Hvilket lambda-uttrykk implementerer følgende funksjonelle grensesnitt korrekt?
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår
Awesome!
Completion rate improved to 2.33
Hva er et funksjonelt grensesnitt?
Sveip for å vise menyen
Det er på tide å gå i dybden på hvordan lambdas opprettes i Java og hvilken rolle funksjonelle grensesnitt spiller i denne prosessen.
Et funksjonelt grensesnitt kan brukes til å representere en handling eller operasjon som kan utføres. I stedet for å opprette en hel klasse for en enkel oppgave, kan du definere et grensesnitt med én metode som beskriver handlingen.
Eksempel på et funksjonelt grensesnitt:
@FunctionalInterface
public interface MyFunctionalInterface {
void myMethod(); // The only abstract method
}
Annotasjonen @FunctionalInterface er valgfri, men den hjelper kompilatoren og utviklere ved å sikre at grensesnittet forblir funksjonelt og forhindrer at det legges til flere abstrakte metoder.
Hvorfor trenger vi dem?
I Stream API brukes funksjonelle grensesnitt for å sende ulike oppførsler inn i metoder som arbeider med datasamlinger.
For eksempel kan du sende en filtreringsbetingelse til en metode som velger bestemte elementer fra en liste, eller angi en operasjon for å transformere hvert element, slik det gjøres i metoder som filter() og map().
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); } }
Metoden filter() tar et spesielt funksjonelt grensesnitt kalt Predicate<T> (som du vil lære mer om senere), som sjekker om et element oppfyller en bestemt betingelse. I dette tilfellet avgjør lambda-uttrykket n -> n % 2 == 0 om et tall er partall. Hvis tallet er delelig med 2 uten rest, forblir det i strømmen.
Lage et egendefinert funksjonelt grensesnitt
Anta at du trenger et grensesnitt for å utføre aritmetiske operasjoner som addisjon eller subtraksjon.
Du kan lage et funksjonelt grensesnitt kalt ArithmeticOperation med en metode apply som utfører en operasjon på to tall, a og b.
@FunctionalInterface
public interface ArithmeticOperation {
int apply(int a, int b); // Method to perform an operation on two numbers
}
Nå som du har grensesnittet, kan du bruke lambda-uttrykk til å definere ulike operasjoner som addisjon og subtraksjon:
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-uttrykkene (a, b) -> a + b og (a, b) -> a - b implementerer metoden apply i grensesnittet, og utfører henholdsvis addisjon og subtraksjon. Det første lambda-uttrykket returnerer summen av to tall, mens det andre returnerer differansen.
Denne tilnærmingen gir en fleksibel måte å bruke ulike aritmetiske operasjoner uten behov for å opprette egne klasser for hver enkelt.
1. Hva er et funksjonelt grensesnitt i Java?
2. Hvilket lambda-uttrykk implementerer følgende funksjonelle grensesnitt korrekt?
Takk for tilbakemeldingene dine!