目录
lambda表达式很大一个作业就是简化匿名内部类
public class case1 {
public static void main(String[] args) {
Integer[] arr = {2,5,1,0,9,7,4};
Integer[] arr2 = {2,5,1,0,9,7,4};
//使用匿名内部类作为比较器
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
}
});
//可以简化为lambda表达式
Arrays.sort(arr2,(Integer o1,Integer o2)->{
return o1-o2;
});
String s1 = Arrays.toString(arr);
String s2 = Arrays.toString(arr2);
System.out.println(s1);
System.out.println(s2);
}
}
我们也可以看到,运行之后的结果是一样的
lambda表达式的格语法:
注意点:
什么是函数式接口呢?
如果说,?个接口中,要求实现类必须实现的抽象方法,有且只有?个!这样的接口,就是函数式接口。
interface InterA{
public void show();
}
interface InterA{
void show();
}
public class case1 {
//参数是接口,正常情况下要传一个实现了接口的类才行
public static void show(InterA a){
a.show();
}
//使用匿名类去实现
public static void main(String[] args) {
show(new InterA() {
@Override
public void show() {
System.out.println("hhhh");
}
});
//使用lambda去简化
show(()->{
System.out.println("lllllllll");
});
}
}
需要用到forEach方法
我们这里来列举一个遍历Map的例子
public class Map遍历 {
public static void main(String[] args) {
Map<String,Integer> m1 = new HashMap();
m1.put("zhangsan",100);
m1.put("lisi",99);
m1.put("wangwu",98);
m1.put("maliu",97);
Set<String> keys = m1.keySet();
//3.lambda表达式
keys.forEach(str ->{
System.out.println(str + " - "+m1.get(str));
});
}
}
参数部分的精简
参数的类型
由于在接口的方法中,已经定义了每?个参数的类型是什么。而且在使用lambda表达式实现接口的时候,必须要保证参数的数量和类 型需要和接口中的方法保持?致。因此,此时lambda表达式中的参数的类型可以省略不写。
注意点:
如果需要省略参数的类型,要保证:要省略, 每?个参数的类型都必须省略不写。绝对不能出现,有的参数类型省略了,有的参数类型没有省略。
//有参+返回值
Test test = (name,age) -> {
System.out.println(name+age+"岁了!");
return age + 1;
};
int age = test.test("小新",18);
System.out.println(age);
参数的小括号
如果方法的参数列表中的参数数量 有且只有?个,此时,参数列表的小括号是可以省略不写的。
注意事项:
Test test = name -> System.out.println(name+"test");
test.test("小新");
return的精简
如果?个方法中唯?的?条语句是?个返回语句, 此时在省略掉大括号的同时, 也必须省略掉return。
Test test = (a,b) -> a+b;