Stream流的使用
public class Emp {
private String name;
private Integer age;
private String address;
public Emp(String name, Integer age, String address) {
super();
this.name = name;
this.age = age;
this.address = address;
}
}
public static void main(String[] args) {
List<Emp> list = new ArrayList<Emp>();
List<Emp> list2 = new ArrayList<Emp>();
list.add(new Emp("张三", 12, "湖北武汉"));
list.add(new Emp("李四", 13, "湖北襄阳"));
list.add(new Emp("王五", 11, "湖北武汉"));
list.add(new Emp("赵柳", 14, "湖北东津"));
list.add(new Emp("秦琪", 13, "湖北汉口"));
list.add(new Emp("秦琪", 13, "湖北汉口"));
list2.add(new Emp("张三", 12, "湖北武汉"));
list2.add(new Emp("李四", 13, "湖北襄阳"));
list2.add(new Emp("王五", 11, "湖北武汉"));
list2.add(new Emp("赵柳", 14, "湖北东津"));
list2.add(new Emp("秦琪", 13, "湖北汉口"));
list2.add(new Emp("秦琪", 13, "湖北汉口"));
}
1.排序
1.1正序
list.stream().forEach(System.out::println);
输出结果:
Emp{name='张三', age=12, address='湖北武汉'}
Emp{name='李四', age=13, address='湖北襄阳'}
Emp{name='王五', age=11, address='湖北武汉'}
Emp{name='赵柳', age=14, address='湖北东津'}
Emp{name='秦琪', age=13, address='湖北汉口'}
Emp{name='秦琪', age=13, address='湖北汉口'}
1.2倒序
list.stream().sorted((a,b)->Integer.compare(b.getAge(), a.getAge())).forEach(System.out::println);
list2.stream().sorted(Comparator.comparing(Emp::getAge).reversed()).
forEach(System.out::println);
输出结果:
list:
Emp{name='赵柳', age=14, address='湖北东津'}
Emp{name='李四', age=13, address='湖北襄阳'}
Emp{name='秦琪', age=13, address='湖北汉口'}
Emp{name='秦琪', age=13, address='湖北汉口'}
Emp{name='张三', age=12, address='湖北武汉'}
Emp{name='王五', age=11, address='湖北武汉'}
list2:
Emp{name='赵柳', age=14, address='湖北东津'}
Emp{name='李四', age=13, address='湖北襄阳'}
Emp{name='秦琪', age=13, address='湖北汉口'}
Emp{name='秦琪', age=13, address='湖北汉口'}
Emp{name='张三', age=12, address='湖北武汉'}
Emp{name='王五', age=11, address='湖北武汉'}
#####1. 3limit()用法
筛选出前两个数据
list.stream().limit(2).collect(Collectors.toList()).forEach(System.out::println);
输出结果:
Emp{name='张三', age=12, address='湖北武汉'}
Emp{name='李四', age=13, address='湖北襄阳'}
1.4skip()用法
删除前两个数据
List<Emp> collect = list.stream().skip(2).collect(Collectors.toList());
输出结果:
[Emp{name='王五', age=11, address='湖北武汉'},
Emp{name='赵柳', age=14, address='湖北东津'},
Emp{name='秦琪', age=13, address='湖北汉口'},
Emp{name='秦琪', age=13, address='湖北汉口'}]
2.条件过滤
过滤年龄大于12岁的
list.stream().filter(a->a.getAge()>12).collect(Collectors.toList()).forEach(System.out::println);
输出结果:
Emp{name='李四', age=13, address='湖北襄阳'}
Emp{name='赵柳', age=14, address='湖北东津'}
Emp{name='秦琪', age=13, address='湖北汉口'}
Emp{name='秦琪', age=13, address='湖北汉口'}
筛选联查:筛选年龄大于12切地址为湖北襄阳的数据
list.stream().filter(a->a.getAge()>12)
.filter(b->b.getAddress()=="湖北襄阳").collect(Collectors.toList())
.forEach(System.out::println);
输出结果:
Emp{name='李四', age=13, address='湖北襄阳'}
3.去重
3.1distinct()用法
去除完全相同的数据,对象必须重写hash以及equal方法
list.stream().distinct().collect(Collector.toList()).forEach(System.out::println);
4.按照指定属性进行去重
指定按照年龄去重
list.stream().collect(Collectors.collectingAndThen
(Collectors.toCollection(
()->new TreeSet<>(Comparator.comparing(Emp::getAge))),ArrayList::new)).forEach(System.out::println);
输出结果:
Emp{name='王五', age=11, address='湖北武汉'}
Emp{name='张三', age=12, address='湖北武汉'}
Emp{name='李四', age=13, address='湖北襄阳'}
Emp{name='赵柳', age=14, address='湖北东津'}
指定地址去重
list.stream().collect(Collectors.collectingAndThen
(Collectors.toCollection(()->new TreeSet<>(Comparator.comparing(Emp::getAddress))),ArrayList::new))
.forEach(System.out::println);
输出结果:
Emp{name='赵柳', age=14, address='湖北东津'}
Emp{name='张三', age=12, address='湖北武汉'}
Emp{name='秦琪', age=13, address='湖北汉口'}
Emp{name='李四', age=13, address='湖北襄阳'}
5.常见方法
max,min,findAny,findFirst,总和,分组,平均数。。。
//年龄最大
Optional<Emp> max = list.stream().max(Comparator.comparing(Emp::getAge));
//年龄最小
Optional<Emp> max1 = list.stream().max(Comparator.comparing(a -> a.getAge()));
//一次性获取最大,最小,平均,总和
list.stream().collect(Collectors.summarizingInt(user -> user.getAge()));
//输出结果:IntSummaryStatistics{count=6, sum=76, min=11, average=12.666667, max=14}
//分组求和
Map<Integer, Long> collect12 = list.stream().collect(Collectors.groupingBy(Emp::getAge, Collectors.counting()));
//输出结果 {11=1, 12=1, 13=3, 14=1} {age,count}