关于Java 8新引入语法特性的简要说明

Java 8在语法上的主要改进就是新增了Lambda Expression以及Method Reference。因为官方网站的介绍稍显罗嗦,并且例子也有些复杂。我这里将提供一些更为浅显、直观的例子来帮助你们理解Java 8新引入的语法特性。java


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表达式的函数调用签名。ide

而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以后,能够简化不少设计。下面例子也会呈现这点:spa

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);
    }
}
相关文章
相关标签/搜索