了解:Stream流
本质:数据渠道,用于操作数据源(集合、数组等)所产生的元素序列。
应用:处理集合
分类:串行流stream()、并行流parallelStream()
特点:
- Stream自己不会存储元素。
- Stream不会改变源对象。相反,它们会返回一个持有结果的新Stream。
- Stream操作是延迟执行的,即它们会等到需要结果的时候才执行。
创建Stream
- 通过Collection系列集合提供的stream()或parallelStream()
List<String> list1 = new ArrayList<>();
Stream<String> stream1 = list1.stream();
- 通过Arrays中的静态方法stream()获取数组流
MyObj[] m = new MyObj[10];
Stream<MyObj> stream1 = Arrays.stream(m);
- 通过Stream类中的静态方法of()
Stream<String> s = Stream.of("aa","bb","cc"); //可变参数,你也可以传数组
- 创建无限流
//迭代
Stream<Integer> s = Stream.iterate(0,(x) -> x+2);
/*
s.limit(10).forEach(System.out::println); //0 2 4 6 8 10 12 14 16 18
*/
//生成
Stream.generate(() -> Math.random())
collect():将流转换为其他形式
了解:Collectors实用类
使用其方法,创建收集器的实例
//将流转换为List
List<String> list = employees.stream()
.map(MyObj::getName)
.collect(Collectors.toList());
//复杂情况:将流转换为HashSet
HashSet<String> ha = MyObj.stream()
.map(MyObj::getName)
.collect(Collectors.toCollection(HashSet::new));
收集其它数据
//求和
Long count = myObj.stream()
.collect(Collectors.counting());
//求最大值
Optional<MyObj> max = myObj.stream()
.collect(Collectors.maxBy((e1,e2) -> Double.compare(e1.getSalary(), e2.getSalary())));
分组
//简单分组
Map<Status, List<Employee>> map = myObj.stream()
.collect(Collectors.groupingBy(MyObj::getStatus));
//多级分组
Map<Status, Map<String, List<MyObj>>> map = myObj.stream()
.collect(Collectors.groupingBy(Employee::getStatus, Collectors.groupingBy((e) -> {
if(((MyObj) e).getAge() <= 35) {
return "青年";
}else if(((MyObj) e).getAge() <= 50) {
return "中年";
}else return "老年";
)));
分区
//根据工资whether大于八千分区
Map<Boolean, List<MyObj>> map = myObj.stream()
.collect(Collectors.partitioningBy((e) -> e.getSalary() > 8000));
异常处理:计算返回结果为空(空指针异常)
返回结果有可能为空时,将其封装在Optional<泛型>
中
联动 with 数据库
【select】filter筛选,map映射
【排序】sorted()
【取第一个】findFirst()
【取任意一个】findAny()
【计算】count()
【最值】max()、min()
【分组】