Vad är ett funktionellt gränssnitt?
Det är dags att fördjupa sig i hur lambdauttryck skapas i Java och vilken roll funktionella gränssnitt spelar för dem.
Ett funktionellt gränssnitt kan användas för att representera en åtgärd eller operation som kan utföras. Istället för att skapa en hel klass för en enkel uppgift kan du definiera ett gränssnitt med en enda metod som beskriver åtgärden.
Exempel på ett funktionellt gränssnitt:
@FunctionalInterface
public interface MyFunctionalInterface {
void myMethod(); // The only abstract method
}
Annoteringen @FunctionalInterface är valfri, men den hjälper kompilatorn och utvecklare genom att säkerställa att interfacet förblir funktionellt och förhindrar tillägg av flera abstrakta metoder.
Varför behöver vi dem?
I Stream API används funktionella gränssnitt för att överföra olika beteenden till metoder som arbetar med datamängder.
Till exempel kan du överföra ett filtreringsvillkor till en metod som väljer specifika element från en lista eller ange en operation för att transformera varje element, vilket används i metoder som filter() och 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 ett speciellt funktionellt gränssnitt som kallas Predicate<T> (som du kommer att gå igenom senare), vilket kontrollerar om ett element uppfyller ett visst villkor. I detta fall avgör lambda-uttrycket n -> n % 2 == 0 om ett tal är jämnt. Om talet är delbart med 2 utan rest, stannar det kvar i strömmen.
Skapa ett eget funktionellt gränssnitt
Antag att du behöver ett gränssnitt för att utföra aritmetiska operationer som addition eller subtraktion.
Du kan skapa ett funktionellt gränssnitt kallat ArithmeticOperation med en metod apply som utför en operation på två tal, a och b.
@FunctionalInterface
public interface ArithmeticOperation {
int apply(int a, int b); // Method to perform an operation on two numbers
}
Nu när du har interfacet kan du använda lambdauttryck för att definiera olika operationer såsom addition och subtraktion:
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-uttrycken (a, b) -> a + b och (a, b) -> a - b implementerar metoden apply i gränssnittet och utför addition respektive subtraktion. Det första lambda-uttrycket returnerar summan av två tal, medan det andra returnerar deras differens.
Detta tillvägagångssätt ger ett flexibelt sätt att använda olika aritmetiska operationer utan att behöva skapa separata klasser för varje operation.
1. Vad är ett funktionellt gränssnitt i Java?
2. Vilket lambda-uttryck implementerar korrekt följande funktionella gränssnitt?
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Awesome!
Completion rate improved to 2.33
Vad är ett funktionellt gränssnitt?
Svep för att visa menyn
Det är dags att fördjupa sig i hur lambdauttryck skapas i Java och vilken roll funktionella gränssnitt spelar för dem.
Ett funktionellt gränssnitt kan användas för att representera en åtgärd eller operation som kan utföras. Istället för att skapa en hel klass för en enkel uppgift kan du definiera ett gränssnitt med en enda metod som beskriver åtgärden.
Exempel på ett funktionellt gränssnitt:
@FunctionalInterface
public interface MyFunctionalInterface {
void myMethod(); // The only abstract method
}
Annoteringen @FunctionalInterface är valfri, men den hjälper kompilatorn och utvecklare genom att säkerställa att interfacet förblir funktionellt och förhindrar tillägg av flera abstrakta metoder.
Varför behöver vi dem?
I Stream API används funktionella gränssnitt för att överföra olika beteenden till metoder som arbetar med datamängder.
Till exempel kan du överföra ett filtreringsvillkor till en metod som väljer specifika element från en lista eller ange en operation för att transformera varje element, vilket används i metoder som filter() och 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 ett speciellt funktionellt gränssnitt som kallas Predicate<T> (som du kommer att gå igenom senare), vilket kontrollerar om ett element uppfyller ett visst villkor. I detta fall avgör lambda-uttrycket n -> n % 2 == 0 om ett tal är jämnt. Om talet är delbart med 2 utan rest, stannar det kvar i strömmen.
Skapa ett eget funktionellt gränssnitt
Antag att du behöver ett gränssnitt för att utföra aritmetiska operationer som addition eller subtraktion.
Du kan skapa ett funktionellt gränssnitt kallat ArithmeticOperation med en metod apply som utför en operation på två tal, a och b.
@FunctionalInterface
public interface ArithmeticOperation {
int apply(int a, int b); // Method to perform an operation on two numbers
}
Nu när du har interfacet kan du använda lambdauttryck för att definiera olika operationer såsom addition och subtraktion:
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-uttrycken (a, b) -> a + b och (a, b) -> a - b implementerar metoden apply i gränssnittet och utför addition respektive subtraktion. Det första lambda-uttrycket returnerar summan av två tal, medan det andra returnerar deras differens.
Detta tillvägagångssätt ger ett flexibelt sätt att använda olika aritmetiska operationer utan att behöva skapa separata klasser för varje operation.
1. Vad är ett funktionellt gränssnitt i Java?
2. Vilket lambda-uttryck implementerar korrekt följande funktionella gränssnitt?
Tack för dina kommentarer!