在实际使用,从数据库中读取的结果大多是以List集合的形式读取。
而使用Stream类可以大大提升我们的开发速度。
首先简单介绍一下Stream的原理
将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。
集合有两种方式生成流:
-
stream() − 为集合创建串行流。
-
parallelStream() − 为集合创建并行流。
如何选择:较少的线程会使cpu未充分利用,过多的线程会增加开销。简单来讲就是,计算量少的用串行,多的用并行。
下面将介绍几种情况的示例
对读取的集合结果按某个条件进行过滤
List<User> filterList = list.stream().filter(user -> user.getAge() >= 40)
.collect(toList());
对读取的集合结果进行去重
List<User> distinctList = filterList.stream().distinct()
.collect(toList());
对读取的集合结果按某个条件进行排序
List<User> sortedList = distinctList.stream().sorted(Comparator.comparingInt(User::getAge))
.collect(toList());
对读取的集合结果返回前几个元素
List<User> limitList = sortedList.stream().limit(1)
.collect(toList());
对读取的集合结果跳过前几个元素
List<User> limitList = sortedList.stream().skip(1)
.collect(toList());
对读取的集合结果调用某个方法
List<String> cityList = list.stream().map(User::getAddress).distinct().collect(toList());
对读取的集合结果合查找是否满足条件
boolean isAdult = list.stream().allMatch(user -> user.getAge() >= 18);
对读取的集合结果查找是否有任一满足条件
boolean isGirl = list.stream().anyMatch(user -> user.getSex() == 1);
对读取的集合结果查找是否没有任一能匹配条件
boolean isLSJ = list.stream().noneMatch(user -> user.getAddress().contains("巴黎"));
对读取的集合结果找符合条件的第一个元素
Optional<User> fristUser = list.stream().findFirst();
对读取的集合结果找任意一个元素(在并行流中)
Optional<User> anyUser = list.stream().findAny();
对读取的集合结果求总数量
long count = list.stream().collect(Collectors.counting());
或者
long count = list.stream().count();
对读取的集合结果获取某一属性最大值
Optional<User> max = list.stream().collect(Collectors.maxBy(
Comparator.comparing(User::getAge)));
对读取的集合结果获取某一属性最小值
Optional<User> min = list.stream().collect(Collectors.minBy(
Comparator.comparing(User::getAge)));
对读取的集合结果求某一属性的总和
int totalAge = list.stream().collect(Collectors.summingInt(User::getAge));
对读取的集合获得BigDecimal的总和
BigDecimal sum = myList.stream() .map(User::getMoney)
.reduce(BigDecimal.ZERO,BigDecimal::add);
对读取的集合结果求某一属性平均值
double avgAge = list.stream().collect(
Collectors.averagingInt(User::getAge));
对读取的集合结果一次性得到元素的4种属性
IntSummaryStatistics statistics = list.stream().collect(
Collectors.summarizingInt(User::getAge));
对读取的集合结果进行字符串的拼接
String names = list.stream().map(User::getName)
.collect(Collectors.joining(", "));
对读取的集合结果根据某一属性进行分组
Map<String, List<User>> cityMap = list.stream()
.collect(Collectors.groupingBy(User::getAddress));
对读取的集合结果根据某一属性进行多次分组
Map<String, Map<Integer, List<User>>> group = list.stream().collect(
Collectors.groupingBy(User::getAddress, // 一级分组,按所在地区
Collectors.groupingBy(User::getSex))); // 二级分组,按性别
对读取的集合结果进行分组统计
Map<String, Long> cityCountMap = list.stream()
.collect(Collectors.groupingBy(User::getAddress,Collectors.counting()));
对读取的集合结果根据某一属性的判断进行多次分组
//根据年龄是否小于等于30来分区
Map<Boolean, List<User>> part = list.stream()
.collect(partitioningBy(user -> user.getAge() <= 30));
合并几个流
List<String> flatList = new ArrayList<>();
flatList.add("唱,跳");
flatList.add("rape,篮球,music");
flatList = flatList.stream().map(s -> s.split(",")).flatMap(Arrays::stream).collect(toList());