目录
一、Stream简介
Stream是Java8中的新特性,java8 中的 stream 与IO流完全不同。
是对数据进行遍历的高级迭代器(遍历数据的同时还能操作数据)
将集合、数组中的数据,放在流对象中,进行操作,操作完后返回需要的数据类型。
Stream不存储数据
集合(数组)--->Stream--->中间操作(过滤、去重、排序等...)--->Stream--->中间操作(过滤、去重、排序等...)--->终端操作(拿到所需数据)
1.获取流 将原始集合或数组对象转换为Stream流对象
2.中间操作()对Stream流对象中的元素进行一系列的过滤、查找等中间操作,返回的仍然为流对象
3.终端操作() 对Stream流进行遍历、统计、收集等终结操作,获取想要的结果。
支持链式操作
查找A2 省去了遍历集合
ArrayList<Car_Demo3> arrayList=new ArrayList();
Car_Demo3 c1=new Car_Demo3(1,"A1");
Car_Demo3 c2=new Car_Demo3(2,"A2");
Car_Demo3 c3=new Car_Demo3(3,"A3");
Car_Demo3 c4=new Car_Demo3(4,"A4");
arrayList.add(c1);
arrayList.add(c2);
arrayList.add(c3);
arrayList.add(c4);
List<Car> cars= arrayList.stream() //将集合数据放到流中
.filter((c)->{ //lambda表达式
return c.name.equals("A2");
})// 流中提供的过滤功能,处理完成,返回的还是流
.sorted()//对流进行排序
.collect(Collectors.toList());//将流转为集合
二、获取流
使用 Collection 接口下的 stream()
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream();
使用 Arrays 中的 stream() 方法,将数组转成流
Integer[] nums = new Integer[10];
Stream<Integer> stream = Arrays.stream(nums);
使用 Stream 中的静态方法:of()
Stream<Integer> stream = Stream.of(1,2,3,4,5,6);
使用 BufferedReader.lines() 方法,将每行内容转成流
BufferedReader reader=new BufferedReader(new FileReader("stream.txt"));
Stream<String> lineStream = reader.lines();
ArrayList list=new ArrayList();
list.stream();//把集合的元素放到流中去
int []nums={4,5,6,8,2,1,4,6,4,7,5,2,1};
Arrays.stream(nums);//将数组元素放入 返回流对象
Stream.of(5,1,2,4,1,2,4,1);//将数组元素放入 返回流对象
三、中间操作
filter:过滤流中的某些元素,
sorted(): 自然排序,流中元素需实现 Comparable 接口
distinct: 去除重复元素
limit(n): 获取 n 个元素
skip(n): 跳过 n 元素,配合 limit(n)可实现分页
Stream.of(5,1,2,4,1,2,4,1)
.distinct()//去重
.sorted()
.skip(0)//跳过0个元素
.limit(3)//限制三个 第一页 显示三个
.skip(3)//跳过3个元素
.limit(3)//限制三个 第二页 显示三个
.forEach((e)->{
System.out.println(e);
});
limit(n): 限制只获取n个元素
map(): 将其映射成一个新的元素
Stream.of(5,1,2,4,1,2,4,1)
.distinct()//去重
.sorted((o1,o2)->{ // Stream<T> sorted(Comparator<? super T> comparator);
return o2-o1; //倒叙
})
.forEach((e)->{
System.out.println(e);
}); //void forEach(Consumer<? super T> action);
四、终端操作
forEach: 遍历流中的元素
toArray:将流中的元素倒入一个数组
Min:返回流中元素最小值
Max:返回流中元素最大值
count:返回流中元素的总个数
Reduce:所有元素求和
anyMatch:接收一个 Predicate 函数,只要流中有一个元素满足条件则返
回 true,否则返回 false
allMatch:接收一个 Predicate 函数,当流中每个元素都符合条件时才返
回 true,否则返回 false
findFirst:返回流中第一个元素
collect:将流中的元素倒入一个集合,Collection 或 Map
Integer max1=Stream.of(5,1,2,4,1,2,4,1)
.max((o1,o2)->{
return o1-o2;
})//处理完后封装到 Optional中
.get();
System.out.println(max1);
Long coun=Stream.of(5,1,2,4,1,2,4,1)
.distinct()
.count();// 元素个数
System.out.println(coun);
Integer sum=Stream.of(5,1,2,4,1,2,4,1)
.reduce((a,b)->{
return a+b;
})//求和
.get();
System.out.println(sum);
boolean res=Stream.of(5,1,2,4,1,2,4,1)
.anyMatch((e)->{
return e<4;
/*
只要流中有一个元素满足条件则返
回 true,否则返回 false
*/
});
System.out.println(res);
流对象转换
List list=Stream.of(5,1,2,4,1,2,4,1)
.distinct()
.collect(Collectors.toList());
System.out.println(list);
list转 map
ArrayList<Car_Demo3> arrayList=new ArrayList();
Car_Demo3 c1=new Car_Demo3(1,"A1");
Car_Demo3 c2=new Car_Demo3(2,"A2");
Car_Demo3 c3=new Car_Demo3(3,"A3");
Car_Demo3 c4=new Car_Demo3(4,"A4");
arrayList.add(c1);
arrayList.add(c2);
arrayList.add(c3);
arrayList.add(c4);
Map<Integer,String> map=arrayList.stream()
.collect(Collectors.toMap(Car_Demo3::getNum,Car_Demo3::getName));
System.out.println(map);
取出一列
List<Integer> list1=arrayList.stream()
.map(Car_Demo3::getNum)
.collect(Collectors.toList());
System.out.println(list1);