java知识之Lambda表达式

本文主要讲解Lambda表达式的相关知识

一.Lambda简介

  • 面向对象编程思想
    做一件事,找一个能解决这个事情的的对象,调用该方法,完成这件事情,注重的是过程.
  • 函数式编程思想
    做一件事,不在乎具体是谁做的,怎么做的,注重的是结果.
    Lambda表达式则是函数式编程思想,这是Java8出现的新特性,主要是为了简化代码.

二.Lambda表达式的格式

Lambda格式由3个部分组成:

  • 一些参数
  • 一个箭头
  • 一段代码
    Lambda表达式为:
1
2
3
(参数类型 参数名称) ‐> {
代码语句
}

注: 小括号内的语法与传统方法参数列表一致:无参数则留空,多个参数则用逗号分隔. ‐> 是新引入的语法格式,代表指向动作,大括号内的语法与传统方法体要求基本一致.

1.Lambda格式(无参无返回值)

1
2
3
() ‐> {
// 这里可以是一条打印语句
}

2.Lambda格式(有参有返回值)

1
2
3
(参数类型 参数名称) ‐> {
return 返回值;
}

3.Lambda格式(省略)

1
() ‐> // 这里可以是一条打印语句

注:省略了大括号

二.Lambda例子

1.无参无返回值

启用一个线程,采用匿名内部类的方式,一条打印输出的语句

1
2
3
4
5
6
7
8
// 简化前的代码
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("当前线程是:" + Thread.currentThread().getName());
}
};
new Thread(r).start();

以上线程重点在于打印输出的语句,所以可以简化代码为:

1
2
3
4
// 简化后的代码
new Thread(() -> {
System.out.println("当前线程是:" + Thread.currentThread().getName());
}).start();

分析:简化后的代码->左侧的()中的参数为简化前的代码run()的参数,简化后的代码->右侧的大括号对应简化前的代码run()右侧的大括号,Lambda表达式在一定程度上使代码更精简,更美观
注:例子1就是无参无返回值的例子

2.有参有返回值

定义一个list数组,添加两个map

1
2
3
4
5
6
7
8
9
10
11
12
List<Map<String, String>> list = new ArrayList<>();
Map<String, String> map1 = new HashMap<>();
map1.put("name", "王可可");
map1.put("age", "23");
list.add(map1);
Map<String, String> map2 = new HashMap<>();
list.add(map2);
map2.put("name", "李多多");
map2.put("age", "18");
System.out.println(list);
// 结果:[{name=王可可, age=23}, {name=李多多, age=18}]

按照年龄从小到大排序

1
2
3
4
5
6
7
8
// obj1:李多多 obj2:王可可
list.sort((Map<String, String> obj1, Map<String, String> obj2) -> {
// compareTo负数 obj1在前,obj2在后
int res = obj1.get("age").compareTo(obj2.get("age"));
return res;
});
System.out.println(list);
// 结果:[{name=李多多, age=18}, {name=王可可, age=23}]

3.省略格式

继续引用第一个例子,还可以简化为以下格式

1
2
3
new Thread(() ->
System.out.println("当前线程是:" + Thread.currentThread().getName())
).start();

注:唯一的区别是去掉了,大括号{}和大括号中打印语句后的封号