我们很多人在第一次接触java8的lambda表达式时,总有些似懂非懂的感觉(特别是一些经验比较丰富的『老』程序员)。下面我们来看看lambda表达式到底是个什么东东。
常见用法举例
- 排序
//对集合进行排序操作
List<String> names = Arrays.asList("a","c","f","d","b");
//指定排序规则
List<String> sortedList = names
.stream().sorted(
(a,b)->a.compareTo(b)
).collect(Collectors.toList());
//默认字典排序
List<String> sortedList = names
.stream().sorted(String::compareTo).collect(Collectors.toList());
- 线程
//旧用法(匿名内部类)
new Thread(new Runnable(){
public void run() {
System.out.println("hello java");
}
}).start();
//lambda
new Thread(
()->{
System.out.println("hello java");
}
).start();
//lambda(当大括号中只有一行代码时,可以省略大括号)
new Thread(
()->System.out.println("hello java")
).start();
用法说明
很多人在没搞清楚lambda用法时,都会有这么一种经历,就是看得懂别人写的 lambda表达式对应的功能,而自己写时却无人下手。其实原因很简单,就是不了解lambda表达式是怎么来的。为了搞清楚来龙去脉,让我们先来认识一个新概念:函数式接口(@FunctionalInterface)
函数式接口特点
- 接口有且只有一个抽象方法
- 允许定义静态方法(static修饰的方法)
- 允许定义默认方法(default修饰的方法)
- 可以使用@ FunctionalInterface注解声明(只要有且只有一个抽象方法的接口,加不加@ FunctionalInterface注解都是函数式接口,但是如果一个接口不满足第1条规则,加上@ FunctionalInterface注解编译会报错)
函数式接口的书写格式
函数式接口以前的写法,其实就是匿名内部类的写法(以下用Runnable举例,Runnable是JDK提供的一个典型的函数式接口)。对比以下两个用法,你是不是想起了什么,没错,就是lambda表达式写法其实就是函数式接口的简写。
//匿名内部类的写法
Runnable runnable = new Runnable() {
@Override
public void run() {
//做点什么事。。。。
}
};
//lambda写法
Runnable runnableWithLambda = ()->{
//做点什么事。。。。
};
}
用法小结
使用最粗暴的总结,lambda表达式写法,就是把函数式接口的参数和实现体通过"->"操作符进行连接是即可,其实参数列表要用小括号包起来,方法实现体用大括号包起来。
启动线程代码回顾
new Thread(
//下面这行代码,其实就是Runnable的抽象方法run的简写
//因为run方法没有参数,故参数列表部分只有一个小括号'()'
//方法体因为只有一行实现,故把大括号'{}'给省略了
()->System.out.println("hello java")
).start();
排序代码回顾
List<String> names = Arrays.asList("a","c","f","d","b");
//指定排序规则
List<String> sortedList = names
.stream().sorted(
//下面这行代码是对Comparator接口中compareTo方法的简写
(a,b)->a.compareTo(b)
).collect(Collectors.toList());
网友评论