本文目录:
1.lambda表达式
2.函数式接口
3.方法引用
1.lambda表达式
lambda表达式是一个可传递的代码块,可以执行多次。
先看语法:
基本语法:
(parameters) -> expression
或
(parameters) ->{ statements; }
使用实例
// 1. 不需要参数,返回值为 5
() -> 5
// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x
// 3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y
// 4. 接收2个int型整数,返回他们的和,如果此处不声明类型,将无法判断String还是int
(int x, int y) -> x + y
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)
lambda本身的语法比较简单。
这里要说另外一个知识点:函数式接口。
2.函数式接口
先看一下它的定义:
对于只有一个抽象方法的接口,需要这种接口的对象时,就可以提供一个lambda表达式。这种接口就称为函数式接口(functional interface)。
lambda的表达式可以配合函数式接口使用。比如:
Arrays.sort(words,
(first, second) -> first.length() - second.length());
sort方法会接收一个实现了Comparator
Java API 在java.util.function包中定义了很多非常通用的函数式接口。其中一个接口BiFcuntion
BiFunction comp
= (first, second) -> first.length() - second.length();
不过这对于排序并没有帮助。因为Arrays.sort方法不接受一个BiFunction。类似Comparator的接口往往有一个特定的用途。想要用lambda表达式做某些处理,还要谨记表达式的用途,为它建立一个特定的函数式接口。
刚看函数式接口的时候,总不知道某一个是什么作用。其实想知道一个函数式接口的作用,接受什么参数返回什么值,只需点进去看一下它的抽象方法就可以了)
java.util.function包中有一个尤其有用的接口Predicate:
public interface Predicate{
boolean test(T t);
... // Addtional default and static methods
}
它的抽象方法接收一个对象,返回一个boolean类型的值,可以用来做条件判断。如ArrayList类有一个removeIf方法,它的参数就是Predicate。这个接口专门用来传递lambda表达式。例如,下面的语句将从一个数组列表删除所有null值:
list.removeIf(e -> e == null);
3.方法引用(method reference)
有时,可能已有现成的方法可以完成你想要传递到其他代码的墨菊个动作。例如,假设你希望只有出现一个定时器事件就打印这个事件对象。可以这样写:
Timer t = new Timer(1000, event -> System.out.println(event));
但是,如果直接把println方法传递到Timer构造器就更好了,如下:
Timer t = new Timer(1000, System.out::println);
表达式System.out::println是一个方法引用,等价于lambda表达式 x -> System.out.println(x).
下面字太多,贴图了: