Heim > Java > javaLernprogramm > Hauptteil

Detaillierte Erläuterung von Lambda-Ausdrücken in Java-Beispielen

WBOY
Freigeben: 2022-04-24 12:04:48
nach vorne
2143 Leute haben es durchsucht

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);}
Nach dem Login kopieren

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 Detaillierte Erläuterung von Lambda-Ausdrücken in Java-BeispielenLambda

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);}
Nach dem Login kopieren
Der gleiche Effekt wird durch Lambda-Ausdrücke erzielt, aber die Codemenge ist sehr rationalisiert. Das ist der Charme von Lambda-Ausdrücken. 2. Funktionsschnittstelle

Bevor Sie die Syntax von Lambda-Ausdrücken lernen, müssen Sie zunächst wissen, was „funktionale Schnittstelle“ ist. Eine Schnittstelle mit nur „einer zu implementierenden Methode“ wird als funktionale Schnittstelle bezeichnet.
//接口中只有一个待实现的方法 fly,所以这是函数式接口interface Fly{
     void fly(String name);}//接口中有两个待实现的方法 这是不是函数式接口interface Run{
    void fastRun();
    void slowRun();}//接口中有两个方法,但其中一个是已经定义好的default方法,真正需要子类去实现的方法只有一个 这是函数式接口interface Jump{
    void jump();
    default void highJump(){
        System.out.println("跳的更高");
    }}
Nach dem Login kopieren

Sie können der Schnittstelle die Annotation **@FunctionalInterface

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-Ausdruckssyntax

Der 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; }
Nach dem Login kopieren

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();
    }
Nach dem Login kopieren
Detaillierte Erläuterung von Lambda-Ausdrücken in Java-BeispielenDas Folgende sind die wichtigen Merkmale von Lambda-Ausdrücken:

Optionale Typdeklaration

: Lambda-Ausdrücke müssen die Parametertypen der Implementierungsmethoden nicht deklarieren. und der Compiler kann sie einheitlich als Parameterwert identifizieren.
        // 类型声明
        MathOperation addition = (int a, int b) -> a + b;
        // 不用类型声明
        MathOperation subtraction = (a, b) -> a - b;
Nach dem Login kopieren

Optionale Parameterklammern

: 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);
Nach dem Login kopieren


Optionale Klammern

: Wenn der Textkörper eine Aussage enthält, müssen keine Klammern verwendet werden.

     // 多条语句不可以省略大括号
        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;
Nach dem Login kopieren
  • Optionales Rückgabeschlüsselwort: Wenn der Körper nur einen Ausdrucksrückgabewert hat, gibt der Compiler den Wert automatisch zurück. Die geschweiften Klammern müssen angeben, dass der Ausdruck einen Wert zurückgibt.
  // 多条语句的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;
Nach dem Login kopieren
    4. Anwendungsbereich von Lambda-Ausdrücken
  • Lambda-Ausdrücke werden nicht nur zur Vereinfachung der Erstellung einer anonymen Klasse verwendet, sie haben auch weitere Verwendungsmöglichkeiten.
  • 1. Weisen Sie Variablen Werte zu.
    Im obigen Beispiel dient die Verwendung von Lambda-Ausdrücken der Zuweisung von Werten zu Variablen. Dies kann das Codesegment der anonymen inneren Klassenzuweisung vereinfachen und die Leseeffizienz verbessern.
  • MathOperation subtraction = (a, b) -> a - b;
    Nach dem Login kopieren
    2. Als Rückgabeergebnis
    interface MathOperation {
            int operation(int a, int b);
        }
    
        MathOperation getOperation(int a, int b){
            return (a1, b1) -> a+b;
        }
    Nach dem Login kopieren
  • 4. Als Parameter einer gewöhnlichen Methode oder Konstruktormethode
    Im Ausdruckskörper des Lambda-Ausdrucks Auf Variablen außerhalb des Ausdrucks kann zugegriffen werden, andere Variablen können jedoch nicht geändert werden.
  • 6. Referenzschreibmethode des Lambda-Ausdrucks

Beim Erlernen von Lambda stoßen Sie möglicherweise auch auf eine seltsame Schreibweise, wie zum Beispiel den folgenden Code:

MathOperation math[] = {
                (a,b) -> a+b,
                (a,b) -> a-b,
                (a,b) -> a*b        };
Nach dem Login kopieren

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.

Wenn

die 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>
Nach dem Login kopieren

7、Lambda表达式的优缺点

优点:

  • 更少的代码行-lambda表达式的最大好处之一就是减少了代码量。我们知道,lambda表达式只能与功能接口一起使用。例如,Runnable 是一个接口,因此我们可以轻松地应用lambda表达式。

  • 通过将行为作为方法中的参数传递来支持顺序和并行执行-通过在Java 8中使用Stream API,将函数传递给collection方法。现在,集合的职责是以顺序或并行的方式处理元素。

  • 更高的效率-过使用Stream API和lambda表达式,可以在批量操作集合的情况下获得更高的效率(并行执行)。 此外,lambda表达式有助于实现集合的内部迭代,而不是外部迭代。

缺点

  • 运行效率-若不用并行计算,很多时候计算速度没有比传统的 for 循环快。(并行计算有时需要预热才显示出效率优势)
  • 很难调试-Lambda表达式很难打断点,对调式不友好。
  • 不容易看懂-若其他程序员没有学过 lambda 表达式,代码不容易让其他语言的程序员看懂(我学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!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage