Lanbda表达式
Stream流
一。Lambda表达式
也可以成为闭包,推动jdk8发布的最重要的特性
Lambda允许把函数作为一个方法的参数-函数作为参数传递进方法中
使用Lambda 表达式可以使代码变的更加简洁紧凑
格式:
Lambda的标准格式:
(参数列表)->{方法体;return 返回值;}
详情介绍:
(参数列表) 相当于方法的参数,如果没有参数,那么只写小括号即可(小括号不能省略)
->: 固定用法,代码拿着前面的参数,去做什么事情
{}: 大括号中先写计算过程,如果有返回值return 返回值;,如果没有返回值return语句可以省略
//面向对象的格式
new Thread(new Runnable() {
public void run() {
System.out.println("执行了...");
}
}).start();
//Lambda的格式
new Thread(()->{System.out.println("执行了...");}).start();
Lambda的参数和返回值
public static void arraySort1(){
//1.数组
Integer[] nums = {4,5,61,7,8,9,34,56,345};
//2.对数组排序(默认升序)
//Arrays.sort(nums);
// Arrays.sort(nums, new Comparator<Integer>() {
// @Override
// public int compare(Integer o1, Integer o2) {
// //降序
// return o2-o1;
// }
// });
//使用Lambda表达式修改上面冗余的代码
Arrays.sort(nums,(Integer o1, Integer o2)->{return o2-o1;});
//3.输出
System.out.println(Arrays.toString(nums));
}
public static void main(String[] args) {
//1.数组
Dog[] dogs = new Dog[4];
dogs[0] = new Dog(4,"jack",4);
dogs[1] = new Dog(3,"mary",5);
dogs[2] = new Dog(2,"ady",6);
dogs[3] = new Dog(5,"hanmeimei",3);
//2.排序
// Arrays.sort(dogs, new Comparator<Dog>() {
// @Override
// public int compare(Dog o1, Dog o2) {
// //按照狗的年龄降序
// return o2.age-o1.age;
// }
// });
//使用Lambda表达式修改上面冗余的代码
Arrays.sort(dogs,(Dog o1, Dog o2)->{return o2.age-o1.age;});
//3.打印
for (Dog dog : dogs) {
System.out.println(dog);
}
}
Lambda的省略格式
a.参数类型可以省略
b.如果参数只有一个,那么小括号可以省略
c.如果{}中的代码可以写成一句代码.那么{},return关键字和分号可以同时省略(不能省略某个)
//体验一下Lambda表达式(函数式编程)优雅的写法
new Thread(()->{System.out.println("执行了...");}).start();
//省略格式
new Thread(()->System.out.println("执行了...")).start();
//使用Lambda表达式修改上面冗余的代码
Arrays.sort(nums,(Integer o1, Integer o2)->{return o2-o1;});
//省略格式
Arrays.sort(nums,(o1,o2)-> o2-o1);
//使用Lambda表达式修改上面冗余的代码
Arrays.sort(dogs,(Dog o1, Dog o2)->{return o2.age-o1.age;});
//省略格式
Arrays.sort(dogs,(o1,o2)->o2.age-o1.age);
注意事项:
a.Lambda只能用于替换 有且仅有一个抽象方法的接口的匿名内部类对象,这种接口称为函数式接口
b.Lambda具有上下文推断的功能, 所以我们才会出现Lambda的省略格式
二。Stream流
唯一缺点是:代码可读性不高
流Api的接口定义在java.util.stream包下。BaseStream是最基础的接口,但是最常用的是BaseStream的一个子接口--Stream,基本上绝大多数的流式处理都是在Stream接口上定义的
count() 返回流中的元素个数 终端操作
distinct() 去除流中的重复元素, 中间操作
filter() 返回一个满足指定条件的流 中间操作
forEach() 遍历流中的每一个元素,执行action操作 终端操作
limit() 获取流中前maxsize元素 中间操作
map() 对流中的元素调用mapper方法,产生包中含这些元素的新的流
skip()
max()终端操作
min() 终端操作
sorted() 排序,按指定规则 终端操作
sorted(