lambda表达式是java8的新特性,lambda表达式支持将代码块作为方法参数,lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口的实例。
lambda表达式的主要作用就是代替匿名内部类的繁琐语法,它由三部分组成:
1.形参列表。形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。
2.箭头(->)必须通过英文中划线和大于符号组成。
3代码块。如果代码块只包含一条语句,lambda表达式允许省略代码块的花括号,那么这条语句就不要用花括号表示语句结束。lambda代码块只有一条return语句,甚至可以省略return关键字。
lambda表达式与函数式接口:
lambda表达式的目标类型必须是“函数是接口”
Runnable r = () ->{
for(var i=0;i<100;i++)
{
System.out.println();
}
}
Runnable是java本身提供的一个函数式接口。
lambda表达式实现的是匿名方法———因此它只能实现特定的函数式接口中的唯一方法。这意味着Lambda表达式有如下两个限制。
1.lambda表达式的目标类型必须是明确的函数式接口。
2.lambda表达式只能为函数式接口创建对象。Lambda表达式只能实现一个方法,因此它只能为只有一个抽象方法的接口创建对象。
lambda表达式调用Arrays的类方法
public class lambdaArrays
{
var arr1 = new String[] {"java","fkava","fkit","ios","android"};
Arrays.parallelSort(arr1,(o1,o2)-o1.length - o2.length());
System.out.println(Arrays.toString(arr1));
var arr2 = new int[] {3,-4,25,16,30,18};
Arrays.parallelPrefix(arr2,(left,right)->left*right);//left代表数组中前一个索引处的元素,right代表数组中当前索引处的元素
System.out.println(Arrays.toString(arr2));
var arr3 = new long[5];
Arrays.parallelAetAll(arr3,operand ->operand * 5);//operand代表正在计算的元素索引
System.out.println(Arrays.toString(arr3));
}
(o1,o2)-o1.length - o2.length()的lambda表达式的目标类型是Comparator,该Comparator指定了判断字符串大小的标准:字符串越长,即可认为该字符串越大。
(left,right)->left*right的lambda表达式目标类型IntBinaryOperate,该对象将会根据前后两个元素来计算当前元素的值。
operand ->operand * 5的lambda表达式的目标类型是IntToLongFunction,该对象将会根据元素的索引来计算当前元素的值。