lambda

lambda 的通用格式(参数类型可以不用声明):

(Type a, Type b, ……) -> {
    statment1;          //代码1
    statment2;          //代码2
    ……
    return statmentN;
}

当只有一个参数时:

a -> {
    ……
}

当只有一行代码时:

(Type a, Type b, ……) -> expression;

1. 函数式编程

@FunctionalInterface注解声明函数式接口,该接口中只能有一个抽象方法,
例如:

@FunctionalInterface
public static interface Converter<F, T> {
    T converter(F from);
}

可以使用lambda表达式实现函数式接口,在java8之前内部实现接口都是用匿名类的,
例如:

Converter<String, Integer> integerConverter1 = from -> Integer.valueOf(from);

上边的lambda表达式可以简写为:

// method reference
Converter<String, Integer> integerConverter2 = Integer::valueOf;

这就是方法引用,其写法为:

Class or instance :: method

lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义)

int num = 1;  
Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num));
s.convert(2);
num = 5;  
//报错信息:Local variable num defined in an enclosing scope must be final or effectively final

在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量

String first = "";  
Comparator<String> comparator = (first, second) -> Integer.compare(first.length(), second.length());  //编译会出错

results matching ""

    No results matching ""