用Stream类操作数据库读取的结果

在实际使用,从数据库中读取的结果大多是以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());
  
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值