java8 Lambda表达式的使用总结
程序员考拉
共 3337字,需浏览 7分钟
·
2020-11-07 15:10
简介:
Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁,更灵活的代码。
案例:
话不多说,直接先看例子:
语法格式一:无参,无返回值
首先我们先在单元测试内写出我们的原始代码:
定义一个Run接口,里面只有一running(无参)方法
interface Run{
void running();
}
给出初始单元测试,实现Run接口的匿名实现类
@Test
public void test01() {
Run runner=new Run() {
@Override
public void running() {
System.out.println("人类会跑步");
}
};
runner.running();
}
下面便是lambda表达式的使用(打印结果皆是一致):
使用lambda表达式时可写成:
@Test
public void test02() {
Run runner=()->System.out.println("人类会跑步");
runner.running();
}
语法格式二:有一参,无返回值
首先是接口:
interface Run{
void running(String name);
}
匿名实现类:
@Test
public void test07() {
Run runner=new Run() {
@Override
public void running(String name) {
System.out.println(name+"能跑步");
}
};
runner.running("小邱");
}
lambda表达式:
@Test
public void test08() {
Run runner=(String name)->System.out.println(name+"能跑步");
runner.running("小邱");
}
还可直接将数据类型省略,因为可以由编译器推断得出,称为“类型推断”
@Test
public void test08() {
Run runner=(name)->System.out.println(name+"能跑步");
runner.running("小邱");
}
只有一个参数时,可省略小括号:
@Test
public void test09() {
Run runner=name->System.out.println(name+"能跑步");
runner.running("小邱");
}
语法格式三:有两参,无返回值
还是那个接口,在其方法中加入两个参数
interface Run{
void running(String name,int distance);
}
其原匿名实现类:
@Test
public void test01() {
Run runner=new Run() {
@Override
public void running(String name,int distance) {
System.out.println(name+"能跑"+distance+"公里");
}
};
runner.running("小邱",100);
}
使用lambda表达式:
@Test
public void test06() {
Run runner=(String name,int distance)->System.out.println(name+"能跑"+distance+"公里");
runner.running("小邱",100);
}
还可直接将数据类型省略,因为可以由编译器推断得出,称为“类型推断”
@Test
public void test02() {
Run runner=(name,distance)->System.out.println(name+"能跑"+distance+"公里");
runner.running("小邱",100);
}
格式四:有两参,有返回值
这里我们使用java中的Comparator接口来作为例子:
比较传入的两个数的大小
@Test
public void test03() {
Comparator com1=new Comparator() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1, o2);
}
};
int compare1=com1.compare(10, 20);
System.out.println(compare1);
}
按照格式二中的写法便可以写成:
@Test
public void test04() {
Comparator com1=(o1,o2)->Integer.compare(o1, o2);
int compare1=com1.compare(10, 20);
System.out.println(compare1);
}
如果用方法引用(调用类中静态方法)的话就可以写成:
@Test
public void test05() {
Comparator com1=Integer::compare;
int compare1=com1.compare(10, 20);
System.out.println(compare1);
}
格式五:多参,多条语句
匿名实现类:
@Test
public void test07() {
Comparator com1=new Comparator() {
@Override
public int compare(Integer o1, Integer o2) {
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
}
};
}
lambda表达式:
@Test
public void test08() {
Comparator com1=(o1,o2)->{
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
};
}
总结:
1)举例:(o1,o2)->Integer.compare(o1,o2);
2)格式:
“->”:lambda操作符 或 箭头操作符
"->"左边:lambda形参列表(就是接口中的抽象方法的形参列表)
"->"右边:lambda体(就是重写的抽象方法的方法体)
3)
->左边:lambda形参列表的参数类型可以省略(类型推断):如果lambda形参列表只有一个参数,其小括号也可以省略。
->右边:lambda体应该由一对{}包裹,如果lambda题只有一条执行语句,那么可以省略{}
4)lambda的本质:作为接口的实例。
原文链接:csdn.net/qq_45273552/article/details/109296786
评论