Dieser Artikel vermittelt Ihnen relevantes Wissen über Java, das hauptsächlich Probleme im Zusammenhang mit Lambda-Ausdrücken vorstellt und einen Operator **"->"** in der Java-Sprache einführt. Dieser Operator wird Lambda-Operator oder Pfeiloperator genannt Schauen wir es uns gemeinsam an. Ich hoffe, es wird für alle hilfreich sein. Schnittstellen können nicht instanziiert werden, Schnittstellenobjekte können jedoch auf ihre Implementierungsklassenobjekte verweisen. Was ist, wenn die Schnittstelle nicht einmal über ein Implementierungsobjekt verfügt? Sie können auch anonyme Klassen wie folgt verwenden:
public class JavaTest { public static void main(String[] args) { Fly fly = new Fly() { @Override public void fly(String name) { System.out.println(name + "飞行"); } }; fly.fly("张三"); }}interface Fly{ abstract void fly(String name);}
Allerdings ist die Codemenge bei Verwendung der anonymen internen Methode tatsächlich nicht sehr prägnant. Um den Code prägnanter zu gestalten, hat Java die Ausdrucksmethode Lambda
eingeführt Um eine solche Funktion mit einfacherer Syntax zu erreichen, lautet der vereinfachte Code mithilfe von Lambda-Ausdrücken wie folgt:public class JavaTest { public static void main(String[] args) { Fly fly = name -> System.out.println(name + "飞行"); fly.fly("张三"); }}interface Fly{ abstract void fly(String name);}
//接口中只有一个待实现的方法 fly,所以这是函数式接口interface Fly{ void fly(String name);}//接口中有两个待实现的方法 这是不是函数式接口interface Run{ void fastRun(); void slowRun();}//接口中有两个方法,但其中一个是已经定义好的default方法,真正需要子类去实现的方法只有一个 这是函数式接口interface Jump{ void jump(); default void highJump(){ System.out.println("跳的更高"); }}
hinzufügen, um zu bestätigen, dass es sich bei der Schnittstelle um eine funktionale Schnittstelle handelt. Wenn es sich bei der Schnittstelle nicht um eine funktionale Schnittstelle handelt, wird bei der Kompilierung ein Fehler angezeigt.
Warum müssen Sie wissen, was eine funktionale Schnittstelle ist? Da Lambda-Ausdrücke die anonyme Klassenimplementierung einer Schnittstelle vereinfachen, funktioniert sie nur auf funktionalen Schnittstellen**. Das ist leicht zu verstehen. Wenn eine Schnittstelle über mehrere zu implementierende Methoden verfügt, kann der Lambda-Ausdruck nicht erkennen, welche Methode in der Schnittstelle sie implementiert.
3. Lambda-AusdruckssyntaxDer Lambda-Ausdruck führt einen Operator **"->"** in der Java-Sprache ein, der als Lambda-Operator oder Pfeiloperator bezeichnet wird. Es unterteilt Lambda in zwei Teile: Die linke Seite: gibt alle für den Lambda-Ausdruck erforderlichen Parameter an Die rechte Seite: formuliert den Lambda-Körper, also die Funktion, die vom Lambda-Ausdruck ausgeführt werden soll. So:
(parameters) -> expression 或 (parameters) ->{ statements; }
Zusätzlich zu -> und Lambda-Körper können andere Parameter in Lambda-Ausdrücken, wie Parameter, Klammern und eckige Klammern, basierend auf dem Parametertyp und der Codezeilennummer des Methodenkörpers weggelassen werden. Nehmen Sie als Beispiel die Implementierung der folgenden Funktionsschnittstelle: interface MathOperation {
int operation(int a, int b);
}
interface GreetingService {
void sayMessage(String message);
}
private int operate(int a, int b, MathOperation mathOperation){
return mathOperation.operation(a, b);
}
interface NoParam{
int returnOne();
}
// 类型声明 MathOperation addition = (int a, int b) -> a + b; // 不用类型声明 MathOperation subtraction = (a, b) -> a - b;
: Ein Parameter muss nicht mit Klammern definiert werden, aber es müssen keine Parameter oder mehrere Parameter mit Klammern definiert werden.
// 不用括号 GreetingService greetService1 = message -> System.out.println("Hello " + message); // 用括号 GreetingService greetService2 = (message) -> System.out.println("Hello " + message);
Optionale Klammern
// 多条语句不可以省略大括号 MathOperation multiplication = (int a, int b) -> { int num = a+1; num = a + b; return a * b + num; }; // 单条语句可以省略大括号 MathOperation pision = (int a, int b) -> a / b;
// 多条语句的Lambda表达式如果有返回值,需要使用return MathOperation multiplication = (int a, int b) -> { int num = a+1; num = a + b; return a * b + num; }; // 单条语句可以省略return MathOperation pision = (int a, int b) -> a / b;
MathOperation subtraction = (a, b) -> a - b;
interface MathOperation { int operation(int a, int b); } MathOperation getOperation(int a, int b){ return (a1, b1) -> a+b; }
MathOperation math[] = { (a,b) -> a+b, (a,b) -> a-b, (a,b) -> a*b };
Ein Symbol, das Sie noch nie zuvor gesehen haben, erscheint hier: : , this Die Schreibweise wird als Methodenreferenz bezeichnet.
Offensichtlich ist die Verwendung von Methodenreferenzen einfacher als gewöhnliche Lambda-Ausdrücke. Wenndie Implementierung einer funktionalen Schnittstelle zufällig
durch den Aufruf einer Methode erreicht wird, können wir Methodenreferenzen verwenden.public class Java8Tester { public static void main(String args[]){ // 静态方法引用--通过类名调用 GreetingService greetingService = Test::MyNameStatic; greetingService.sayMessage("hello"); Test t = new Test(); //实例方法引用--通过实例调用 GreetingService greetingService2 = t::myName; // 构造方法方法引用--无参数 Supplier<test> supplier = Test::new; System.out.println(supplier.get()); } interface GreetingService { void sayMessage(String message); }}class Test { // 静态方法 public static void MyNameStatic(String name) { System.out.println(name); } // 实例方法 public void myName(String name) { System.out.println(name); } // 无参构造方法 public Test() { }}</test>
更少的代码行-lambda表达式的最大好处之一就是减少了代码量。我们知道,lambda表达式只能与功能接口一起使用。例如,Runnable 是一个接口,因此我们可以轻松地应用lambda表达式。
通过将行为作为方法中的参数传递来支持顺序和并行执行-通过在Java 8中使用Stream API,将函数传递给collection方法。现在,集合的职责是以顺序或并行的方式处理元素。
更高的效率-过使用Stream API和lambda表达式,可以在批量操作集合的情况下获得更高的效率(并行执行)。 此外,lambda表达式有助于实现集合的内部迭代,而不是外部迭代。
推荐学习:《java视频教程》
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung von Lambda-Ausdrücken in Java-Beispielen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!