歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

關於Java 8新引入語法特性的簡要說明

Java 8在語法上的主要改進就是新增了Lambda Expression以及Method Reference。由於官方網站的介紹稍顯羅嗦,而且例子也有些復雜。我這裡將提供一些更為淺顯、直觀的例子來幫助大家理解Java 8新引入的語法特性。

Java 8中的Lambda Expression與C、C++都不太一樣。Apple為LLVM Clang新開發了Blocks語法特性,使得GNU99標准C編譯器在Clang編譯器下就能使用Lambda Expression。而C++則在C++11標准中就引入了Lambda表達式。Clang為Lambda表達式定義了一種新類型——<return type> (^ <block identifier>)(<parameter list>)。這種定義方式非常類似於函數指針,而這也很明顯地表達了Lambda表達式的函數調用簽名。

而C++11則使用[<capture>](<parameter list>) -> { }來定義Lambda,Java 8與之相類似。不過C++11的返回類型直接就是auto,除非使用std::function,否則你無法直接捕獲具體的lambda表達式類型。

而Java 8卻使用了一種與眾不同的方式。你可以自己定義一個接口,然後將該接口引用指向一個Lambda表達式。此接口當然也有限制,即必須是函數接口!什麼是函數接口?即一個interface僅有一個抽象方法的接口稱為是函數接口(functional interface)。然後,lambda表達式的實體定義為:(<參數列表>) -> { <lambda實現> }。其中參數列表需要與函數接口中那唯一的抽象方法的參數列表吻合,而返回類型則直接取該抽象方法的返回類型。另外,Java的Lambda表達式不能像C++的lambda以及Blocks那樣取外部函數的局部變量的引用,使得其內部能直接修改外部函數的局部變量。不過對於final變量是能夠獲取的,這個跟創建匿名類對象一樣。

雖然這種形式有點奇葩,但還好,不算太過麻煩。由於Java比C++或Objective-C來真心啰嗦很多。這次有了Method Reference之後,可以簡化很多設計。下面例子也會呈現這點:

package src;

import java.util.ArrayList;

interface MyLambdaFunc {
    public void call(int p);
}

class MyClass {
   
    public static void helloStaticMehtod(int a) {
        System.out.println("Static method value is: " + a);
    }
   
    public void memberMethod(int a) {
        System.out.println("Member method is: " + a);
    }
   
    public void method1(int a) {
        System.out.println("Method 1:" + (a + 1));
    }
   
    public void method2(int a) {
        System.out.println("Method 2: " + (a + 2));
    }
   
    public void method3(int a) {
        System.out.println("Method 3: " + (a + 3));
    }
}

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("Hello, world");
       
        // Type inference
        ArrayList<String> arr = new ArrayList<>();
        arr.add("hello");
       
        // Lambda Expression test
        final int a = 10;
       
        MyLambdaFunc lambda = (p) -> {
            System.out.println("The value is: " + (a + p));
            };

        lambda.call(100);
// Method Reference test
        MyLambdaFunc methodRef = MyClass::helloStaticMehtod;
        methodRef.call(-100);
       
        MyClass mlc = new MyClass();
        methodRef = mlc::memberMethod;
        methodRef.call(-200);
       
        MyLambdaFunc methodList[] = { mlc::method1, mlc::method2, mlc::method3 };
        methodList[0].call(100);
        methodList[1].call(100);
        methodList[2].call(100);
    }
}

Copyright © Linux教程網 All Rights Reserved