B站视频指路:尚硅谷Java入门视频教程(在线答疑+Java面试真题)_哔哩哔哩_bilibili
写在前面:马上秋招,打算从0开始再学一遍Java,开个知识点记录贴,就当做课堂笔记吧.
Lambda表达式
Lambda是一个匿名函数 我们可以把Lambda表达式理解为一段可以传递的代码(将代码像数据一样进行传递).使用它可以写出更简洁、更灵活的代码 作为一种更紧凑的代码风格 使Java的语言能力得到了提升
例:
package java8new;
import org.junit.Test;
import java.util.Comparator;
public class LambdaTest {
@Test
public void test(){
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("lambda");
}
};
r1.run();
Runnable r2 = ()-> System.out.println("lambda1223234234234");
r2.run();
}
@Test
public void test2(){
Comparator<Integer> comparator = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1,o2);
}
};
int compare = comparator.compare(12, 22);
System.out.println(compare);
//Lambda表达式的写法
Comparator<Integer> comparator2 = (o1, o2) -> Integer.compare(o1,o2);
int compare2 = comparator2.compare(43, 22);
System.out.println(compare2);
//方法引用的写法
Comparator<Integer> comparator3 = Integer::compare;
int compare3 = comparator3.compare(43, 22);
System.out.println(compare3);
}
}
Lambda表达式的使用:
1.举例:(o1, o2) -> Integer.compare(o1,o2);
2.格式:
->: lambda操作符或箭头操作符
->左边: lambda形参列表 (其实就是借口中的抽象方法的形参列表)
->右边: lambda体 (其实就是重写的抽象方法的方法体)
3.lambda的使用:六种
①无参 无返回值
@Test
public void test(){
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("lambda");
}
};
r1.run();
Runnable r2 = ()-> System.out.println("lambda1223234234234");
r2.run();
}
②Lambda需要一个参数 但是没有返回值
@Test
public void test(){
Consumer<String> consumer = new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
};
consumer.accept("爱情三十六计");
System.out.println("________________________");
Consumer<String> con = (String s) -> {
System.out.println(s);
};
con.accept("就像一场游戏");
}
③数据类型可以省略 因为可以由编译器推断得出 称为 "类型推断"
@Test
public void test(){
Consumer<String> con = (String s) -> {
System.out.println(s);
};
con.accept("就像一场游戏");
System.out.println("***************");
Consumer<String> con2 = (s) -> {
System.out.println(s);
};
con.accept("就像一场游戏");
}
④Lambda若只有一个参数时 参数的小括号可以省略
@Test
public void test(){
Consumer<String> con = (s) -> {
System.out.println(s);
};
con.accept("就像一场游戏");
System.out.println("***************");
Consumer<String> con2 = s-> {
System.out.println(s);
};
con.accept("就像一场游戏");
}
⑤Lambda需要两个或以上的参数,多条执行语句,并且可以有返回值
@Test
public void test(){
Comparator<Integer> comparator = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
}
};
System.out.println(comparator.compare(22, 34));
System.out.println("********************");
Comparator<Integer> comparator2 = (o1,o2)->{
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
};
System.out.println(comparator2.compare(22, 34));
}
⑥当Lambda体只有一条语句时 return与大括号若有 都可以省略
@Test
public void test(){
Comparator<Integer> comparator1 = (o1,o2)->{
return o1.compareTo(o2);
};
System.out.println(comparator1.compare(22, 34));
System.out.println("********************");
Comparator<Integer> comparator2 = (o1,o2)-> o1.compareTo(o2);
System.out.println(comparator1.compare(22, 34));
}
总结:
->左边: lambda形参列表的参数类型可以省略(类型推断):若lambda形参列表只有一个参数 其一对()也可省略
->右边:lambda体应该使用一对{}包裹 若lambda体只有一条执行语句(可能是return语句) 可以省略这一对{}和return关键字