java 8的新特性-Lambda
Lambda表达式:
一、Lambda初识
Lambda是一个匿名函数,我们可以吧Lambda表达式理解为一段可以传递的代码(将代码向数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,是Java语言表达能力提升。
二、Lambda基础
1)、Lambda基本语法
- Java8中引入一个新的操作符"->"该操作符称为箭头操作符,箭头操作符将Lambda查分成了两个部分:左侧(Language表达式的参数列表)右侧(Language表达式的代码体)
- 语法一:无参,无返回值
- @Test
void testLambda() {
int num= 0;// 在jdk1.7一前,必须是final,在jdk1.8之后默认加上了final
Runnable runnable =new Runnable() {
@Override
public void run() {
System.out.println("Hello Word!!" + num);
}
};
runnable.run();
System.out.println("---------------");
Runnable runnable1=() -> System.out.println("Hello Lambda" + num);
runnable1.run();
}
执行结果
Hello Lambda!!
---------------
Hello Lambda
进程已结束,退出代码为 0
- 语法二:有一个参数无返回值
@Test
void testLambda() {
Consumer<String> consumer =(x) -> System.out.println(x);
consumer.accept("我今天学习了Lambda!!");
}
执行结果
我今天学习了Lambda!!
- 语法三:只有一个参数,小括号可以不写
@Test
void testLambda() {
Consumer<String> consumer = x -> System.out.println(x);
consumer.accept("我今天学习了Lambda!!");
}
执行结果
我今天学习了Lambda!!
- 语法四:有多个参数,多个返回值,并且Lambda体中有多条语句
- @Test
void testLambda() {
Comparator<Integer> comparator = (o1,o2) -> {
System.out.println("注意多天语句用{}"+o1+o2);
return Integer.compare(o1,o2);
}; //此测试方法没有结果
- 语法五:有多个参数且一条语句,大括号和return都可以省略不写
@Test
void testLambda() {
Comparator<Integer> comparator = (o1,o2) -> Integer.compare(o1,o2);
}
- 语法六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文可以推断出数据类型,即"类型"推断"。
三、Lambda 表达式需要”函数式接口“的支持
1)、函数式接口:接口中只有一个抽象方法的接口,可以使用注解@FunctionInterface 修饰(可以检查是否是函数是接口)
//测试方法
@Test
void testLambda() {
Integer num = SumAndAvg(100, x -> x * x);
System.out.println(num);
}
//实现接口
public Integer SumAndAvg(Integer num, MyFun mf) {
return mf.getnum(num);
}
//接口
@FunctionalInterface
public interface MyFun {
Integer getnum(Integer x);
}
- Lambda练习
//练习一:调用Collections.sort()方法,通过定制排序比较两个Employee(先按年龄,年龄相同按姓名比)
List<Student> students = Arrays.asList(
new Student("陈凯", 100),
new Student("夏洛", 90),
new Student("马冬梅", 10)
);
@Test
void exercise1() {
Collections.sort(students, (e1, e2) -> {
if (e1.getAge().equals(e2.getAge())) {
return e1.getName().compareTo(e2.getName());
} else {
return Integer.compare(e1.getAge(), e2.getAge());
}
});
for (Student student : students) {
System.out.println(student);
}
}
//声明函数式接口,接口中编写方法使用接口作为参数,将一个字符串转换成大写,并作为方法的返回值。
@Test
void exercise2() {
String str = transform("xxxx", (x) -> x.toUpperCase());
System.out.println(str);
}
public String transform(String num, Myfun1 mf1) {
return mf1.getValue(num);
}
//声明一个带两个泛型的函数式的接口,泛型类型<T,R>T为参数,R为返回值
//接口中声明对应的抽象类
//在TestLambda类中声明方法,使用接口作为参数,计算两个Long类型的和,在计算两个Long的乘积。
@Test
void exercise3() {
Long aLong = transform01(23L, 44L, (i, j) -> i + j + i * j);
System.out.println(aLong);
}
public Long transform01(Long i, Long j, Myfun2<Long, Long> mf) {
return mf.grtvalue(i, j);
}