lambda表达式

lambda表达式有3个部分

  • 代码块
  • 参数
  • 自由变量的值—————自由变量是指,即不是参数变量,也不是代码内部定义的变量。

基本语法:
(String first, String second) -> first.length() - first.length()
这样的表达式就是一个简单的代码块,连同必须传递给代码的变量的说明。
对lambda表达式你只能做一将事:将其放入类型为函数式接口的变量中,这样它就被转换为该接口的实例。
例如,将它们传递给期望函数式接口的方法:

Arrays.sort(strings, (String x, String y) -> x.length() - y.length());
//该方法第二个参数为一个Comparator接口的实例

同时还有许多常用的函数式接口(具体列表自己查阅API)。
例如,编写消费lambda表达式的方法:
调用:
repeat(10, (i) -> System.out.println("countdown: " + (9-i)));

声明:

//该IntConsumer函数式接口有个参数类型为int、返回值为void的方法
public static void repeat(int n, IntConsumer action)  
{  
    for(int i = 0;i < n; i++) action.accept(i);  
}

注意:
你不能将一个lambda表达式赋值给一个Object类型的变量,因为Object是类,不是函数式接口。

访问来自闭合作用域的变量

例如:

public static void repeatMessage(String text, int count){  
    Runnable r = ()->{  
        for(int i = 0; i< count; i++){  
            System.out.println(text);  
        }  
    };  
    new Thread(r).start();  
}

public static void repeatMessage(String text, int count){  
    Runnable r = ()->{  
        while (count > 0){  
            count --;//错误:不能改变被捕获的变量  
            System.out.println(text);  
        }  
    };  
    new Thread(r).start();  
}

调用:
repeatMessage("hello", 10);
text和count就是lambda的两个自由变量。lambda表达式只能访问来自闭合作用域的final或有效的final的局部变量,并且lambda表达式不能改变任何捕获的变量。

方法引用和构造函数引用

方法引用

操作符 :: 将类或对象名称与方法名称分隔开。
有以下3种使用方式:

  • 类 :: 实例方法
  • 类 :: 静态方法
  • 对象 :: 实例方法

第一种使用方式,第一个参数变成方法的接收者,并且其他参数也传递给该方法。
例如:

String :: compareToIgnoreCase 等价于 (x,y) -> x.compareToIgnoreCase(y)

第二种使用方式,所有的参数传递给静态方法。
例如:

Objects :: isNull 等价于 x -> Objects.isNull(x)

第三种使用方式,在给定的对象上调用方法,并且参数传递给实例方法。
例如:

System.out :: println 等价于 x-> System.out.println(x)

构造函数引用

与方法引用类似,不同的是构造函数引用中的方法名都是new。
例如:

int[] :: new //是一个含有一个参数的构造函数引用,该参数为数组长度
等价于 n->new int[n] 

WinRT
24 声望4 粉丝

临渊羡鱼,不如退而结网


下一篇 »
异常处理