java8的lambda表达式和函数式接口

本文目录:
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的某个类的实例,在这个对象上调用compare方法(Comparator中唯一的抽象方法)会执行这个lambda表达式的体。

Java API 在java.util.function包中定义了很多非常通用的函数式接口。其中一个接口BiFcuntion描述了参数类型为T和U而且返回类型为R的函数。可以把我们的字符串比较lambda表达式保存在这个类型的变量中:

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).

下面字太多,贴图了:


方法引用.png

你可能感兴趣的:(java8的lambda表达式和函数式接口)