lambda是java8中引入的一个新的操作符“->”,成为箭头操作符或者是lambda操作符。
左侧:lambda表达式的参数列表。
右侧:lambda表达式中所需执行的功能,即lambda体。
依赖于函数式接口,lambda表达式即对接口的实现。
特点:1.lambda使句式变得更加简洁。
话不多说上栗子:
@Test
void contextLoads() {
//未使用lambda表达式
Runnable runnable1 = new Runnable() {
@Override
public void run() {
System.out.println("404");
}
};
//使用lambda表达式
Runnable runnable2=()->System.out.println("404");
}
很明显可以看出使用lambda表达式和不使用的差距在哪里。
2.lambda中的变量
栗子:
int s=5;
Runnable runnable2=()->System.out.println(s++);
这句话是会报错的,原因是当用lambda去调用局部变量时会自动用final修饰
虽然常量无法改变,但是我们可以定义数字,改变数组中的数值
int[] ss=new int [1];
ss[0]=1;
Runnable runnable2=()->{
ss[0]++;
System.out.println( );
};
这样就不报错了
3.有一个参数值
Consumerconsumer = (x)->{System.out.println(x);}; consumer.accept("s886");
这段代码就是将accept得到的参数作为x然后输出。
4.只有一个参数,省略括号
Consumerconsumer = x->{System.out.println(x);}; consumer.accept("ssssss");
当只有一个参数时,()可以省略,lambda表达式的宗旨就是能省则省。
5.有两个参数以上,有返回值且有多条语句
Comparatorconsumer1 = (x, y)->{ System.out.println("ISO-8859-1"); return Integer.compare(x,y); };
参数的小括号不能省略,需要去return。
6.lambda中只有一条语句时
Comparatorconsumer2 = (x, y)-> Integer.compare(x,y);
{}和return都可以省略
四大内置函数:lambda表达式依赖的常见四大内置函数。
| 类型 | 类 | 抽象方法 |
| 消费型接口 | Consumer | void accept(T t) |
| 供给型接口 | Supplier | T get(); |
| 函数型接口 | Function | R apply(T t) |
| 断言型接口 | Predicate | boolean test(T t) |
1.数字型
public static ListNumber (int n, Supplier s){ List list =new ArrayList<>(); for(int i=0;i num = Number(4,()->(int)(Math.random()*100)); num.forEach(System.out::println); }
上面是我们定义的方法,第一次参数n就是我们需要添加数字的数量,第二个参数就是一个供给型的函数接口。
(如何快速生成 List
传送门 idea自动补全代码,一秒生成new List,写代码更便捷,快捷方法!_非又肝的博客-CSDN博客)
2.字符串型
public static String Str(String str, Functionfun){ return fun.apply(str); } public static void main(String[] args) { String re = Str("404+",(x)->x+"505"); System.out.println(re); }
第一个参数就是一个字符串,第二个参数是函数型接口,调用时我们将x+"字符串"赋值给re,然后输出。
方法引用:1.对象::实例化方法名
@Test
public void test1(){
Consumer con = System.out::println;
con.accept("asdasd");
}
2.类::静态方法名
@Test
public void test2(){
Comparator com1 =(x,y)->Integer.compare(x,y);
Comparator com2 = Integer::compare;
}
这两种方法是等价的,第二种方法相当于直接调用了Integer中的静态方法compare。
3.类::实例方法名
@Test
public void test3(){
BiPredicate com1 =(x, y)->x.equals(y);
BiPredicate com2 = String::equals;
}
这两种方法是等价的,但是第二种方法中,第一个参数是方法的调用者,第二个参数是方法的参数。



