Java Lambda&Stream
一、Lambda
1)背景
java 是面向对象的语言,想方法传递参数不能是单个函数。
eg: sort() 需要一个比较的函数,只能创建一个函数,将方法包装在对象中传递,可以通过创建匿名内部类对象,将比较函数包装起来。
java 8 之后为了再次简化语法,推出了Lambda 语法
2)Lambda表达式
Lambda 表达式就是一个匿名函数,简化匿名内部类语法。
以后可以将匿名内部类当作参数传递,由java 根据语言进行 推断,不全常规代码。
package com.xytx.javalambdastream.lambda;
public class Car {
private String name;
private int num;
public Car(String name, int num) {
this.name = name;
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", num=" + num +
'}';
}
}
package com.xytx.javalambdastream.lambda;
import java.util.Arrays;
public class Test1 {
public static void main(String[] args) {
Car car1 = new Car("奔驰",1);
Car car2 = new Car("奔驰",2);
Car car3 = new Car("奔驰",3);
Car car4 = new Car("奔驰",4);
Car car5 = new Car("奔驰",5);
Car [] cars = {car2,car4,car5,car3,car1};
Arrays.sort(cars,(c1,c2)->{ // 根据cars 类型推断c1,c2类型,从而补全常规代码
return c1.getNum()-c2.getNum();
});
System.out.println(Arrays.toString(cars));
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o4Ps9d2H-1661865248773)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\1658192173580.png)]
Lambda 表达式本质 —>“语法糖”
**“语法糖”😗*也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。
3)Lambda 结构
(1)无参无返回值
package com.xytx.javalambdastream.lambda;
@FunctionalInterface
public interface Oper {
//使用Lambda 表达式前提,接口中只能有一个抽象方法,因为需要自动类型推断
//@FunctionalInterface 表示是一个功能函数接口,接口中只能定义一个抽象方法
public void show();
}
package com.xytx.javalambdastream.lambda;
import java.util.Arrays;
public class OperTest {
public static void main(String[] args) {
OperTest test = new OperTest();
test.run(()->{
System.out.println("无参无返回值");
});
}
public void run(Oper test){ //调用接口中的抽象方法
test.show();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O8UK9wAJ-1661865248775)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\1658193309091.png)]
(2)有参有返回值
package com.xytx.javalambdastream.lambda;
@FunctionalInterface
public interface Oper {
//使用Lambda 表达式前提,接口中只能有一个抽象方法,因为需要自动类型推断
//@FunctionalInterface 表示是一个功能函数接口,接口中只能定义一个抽象方法
int show(Integer a,Integer b);
}
package com.xytx.javalambdastream.lambda;
public class OperTest {
public static void main(String[] args) {
OperTest test = new OperTest();
test.run((a,b)->{
int c = a + b;
System.out.println(c);
return c;
});
}
public void run(Oper test){ //调用接口中的抽象方法
test.show(5,6);
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CVAXV4DB-1661865248776)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\1658194379909.png)]
二、Stream
1) Stream
Stream 流是java8推出的新功能,与IO流完全不同的。
提供了对象数据集合进行操作的各种方法,我们只需要声明式的告诉其应该做什么。
jave中的集合,数组主要是存储数据,而Stream主要左右是对集合进行操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T7KJ8zFb-1661865248776)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\1658195150407.png)]
Stream 就是一个对集合进行遍历的高级迭代器
2)案例
package com.xytx.javalambdastream.stream;
import java.util.Arrays;
public class Demo1 {
public static void main(String[] args) {
Integer [] arrays = {5,6,8,9,7,5,2,3,1,4,4,5};
Arrays.stream(arrays) //返回一个Stream 对象
.distinct() //去重
.filter((e)->{return e<7;}) //对流进行一个过滤操作,又返回一个流对象
.sorted((a,b)->{return a-b;}) //对流进行一个排序操作,又返回一个流对象
.limit(8) //限制取出元素的个数
.skip(4) //跳过指定数量的元素
.forEach((e)->{//遍历 e
System.out.println(e);
});
}
}
package com.xytx.javalambdastream.stream;
import java.awt.*;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Demo1 {
public static void main(String[] args) {
Integer [] arrays = {5,6,8,9,7,5,2,3,1,4,4,5};
//终端操作
Integer max = Arrays.stream(arrays)
.max((a,b)->{return a-b;}) //获取最大值
.get();
System.out.println(max);
Integer sum = Arrays.stream(arrays)
.reduce((a,b)->{return a+b;}) // 将所以元素相加
.get();
System.out.println(sum);
Object [] objects = Arrays.stream(arrays)
.distinct()
.toArray();//去重之后的数组
System.out.println(Arrays.toString(objects));
boolean b = Arrays.stream(arrays)
.distinct()
.anyMatch((e)->{
return e>8; //如果有元素满足大于8,返回true,反之false
});
System.out.println(b);
boolean b1 = Arrays.stream(arrays)
.distinct()
.allMatch((e)->{
return e<8; //所有元素都满足小于8,返回true,反之false
});
System.out.println(b1);
List<Integer> list = Arrays.stream(arrays)
.distinct()
.collect(Collectors.toList()); //去重过后的转为集合
System.out.println(list);
/*Arrays.stream(arrays) //返回一个Stream 对象
.distinct() //去重
.filter((e)->{return e<7;}) //对流进行一个过滤操作,又返回一个流对象
.sorted((a,b)->{return a-b;}) //对流进行一个排序操作,又返回一个流对象
.limit(8) //限制取出元素的个数
.skip(4) //跳过指定数量的元素
.forEach((e)->{//遍历 e
System.out.println(e);
});*/
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PIpBOK2a-1661865248776)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\1658197849191.png)]
package com.xytx.javalambdastream.stream;
import com.xytx.javalambdastream.lambda.Car;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Demo2 {
public static void main(String[] args) {
Car car1 = new Car("奔驰", 101,"白色");
Car car2 = new Car("奔驰", 102,"粉色");
Car car3 = new Car("奔驰", 103,"红色");
Car car4 = new Car("奔驰", 104,"黑色");
Car car5 = new Car("奔驰", 105,"蓝色");
Car [] cars = {car2,car4,car5,car1,car3};
List<Car> listcar = Arrays.stream(cars)
.sorted((c1,c2)->{return c1.getNum()-c2.getNum();}) //num 排序
.filter((c)->{return c.getColor().equals("黑色");}) //获取想要的颜色的车
.collect(Collectors.toList());
System.out.println(listcar);
Map<Integer,String> carmap = Arrays.stream(cars)
.collect(Collectors.toMap(Car::getNum,Car::getColor));//num--键 color--值
System.out.println(carmap);
//map(); 将其映射成一个新元素
List<String> listcolor = Arrays.stream(cars)
.map(Car::getColor) //将color映射出来,变成一个新元素
.collect(Collectors.toList());
System.out.println(listcolor);
}
}
package com.xytx.javalambdastream.lambda;
public class Car {
private String name;
private int num;
private String color;
public Car(String name, int num, String color) {
this.name = name;
this.num = num;
this.color = color;
}
public Car(String name, int num) {
this.name = name;
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", num=" + num +
'}';
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HbBRZ7RK-1661865248777)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\1658197943891.png)]
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", num=" + num +
'}';
}
}
[外链图片转存中...(img-HbBRZ7RK-1661865248777)]