lambda

函数式接口

一个接口,只有一个方法

@Functionallnterface 可选,非必选

1
2
3
4
5
6
7
@FunctionalInterface
interface GreetingService
{
void sayMessage(String message);
}

GreetingService greetService1 = message -> System.out.println("Hello " + message);

常用的函数式接口:

  • Supplier接口
  • Consumer接口
  • Predicate接口
  • Function接口

Lambda

Lambda表达式只能在可以使用函数式接口实例的地方使用

它支持将代码块作为方法参数,创建只有一个抽象方法的接口的实例

用于简化创建匿名内部类对象

() -> {}

str -> str.toUpperCase()

(String s) -> {}

(a,b) -> {}

替代一个对象,对象内只重写了一个方法

返回值:

1
2
3
4
5
// 右边是一个表达式,它的值就是返回值
(a, b) -> a + b

// 右边部分是一个语句块,那么它必须包含一个 return 语句
(a, b) -> { return a - b; }

Example

1
2
3
4
5
6
7
8
// 匿名内部类的方式:
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类的方式创建线程的任务执行了");
}
});
t2.start();

可省略为:

1
2
3
4
Thread t3 = new Thread(()->{
System.out.println("Lambda表达式的方式");
});
t3.start();

方法引用 ::

方法引用有四种类型:

  • 静态方法引用
    • String::valueOf 直接调用静态方法
      相当于 (x) -> String.valueOf(x)
  • 特定对象的方法引用
    • cat::eat
      相当于 (x) -> cat.eat(x)
  • 该类的任意对象的方法引用
    • String::compareTo
    • 相当于 (x, y) -> x.compareTo(y)
  • 构造方法引用
    • Person::new
      相当于 (x) -> new Person(x)

方法签名相同则可用(方法参数的数量和类型、返回类型相同)

forEach

遍历,方法引用的应用

1
names.forEach(System.out::println);