java8中stream()的使用案例

2023-10-27

	@Test
    public void t1(){
        List<Integer> ids = new ArrayList<>(Arrays.asList(1,1,2,3,1,5));
        List<String> productIds = new ArrayList<>(Arrays.asList("1","1","2","3"));

        // 1. flatMap(Collection::stream) 用于多个stream的合并成一个stream
        List<String> newProductIds = Stream.of(productIds).flatMap(Collection::stream).distinct().collect(Collectors.toList());
        log.info(newProductIds.toString());

        // 2. 聚合 Collectors.toCollection(Arraylist::new) === Collectors.toList()
        Set<String> set = Stream.of("a", "c", "b", "a").collect(Collectors.toCollection(HashSet::new));
        log.info(set.toString());

        // 3. 聚合 Collectors.summarizingXXX() 可以计算list中的max min count sum average等
        String a = productIds.stream().collect(Collectors.summarizingDouble(x -> Double.valueOf(x))).toString();
        log.info(a);

        // 4. 聚合 Collectors.averagingDouble() 可以求和、求平均等
        String b = productIds.stream().collect(Collectors.averagingDouble(x -> Integer.valueOf(x))).toString();
        log.info(b);

        // 5. 去重 distinct()
        List<String> list = productIds.stream().distinct().collect(Collectors.toList());
        log.info(list.toString());

        // 6. 是否存在 anyMatch() 和filter用法相同
        boolean anyMatch = productIds.stream().anyMatch(f -> f.equals("2"));    // 判断列表中是否【存在某个元素】
        boolean allMatch = productIds.stream().allMatch(g -> g.equals("1"));    // 判断列表是否【都是某个元素】
        boolean noneMatch = productIds.stream().noneMatch(j -> j.equals("3"));  // 判断列表中是否【不存在某个元素】
        log.info(anyMatch +"/"+ allMatch +"/"+ noneMatch);

        // 7. 最大值.max(有参数)
        // .max(Comparator.comparing(Object::property)) 按照对象中的某个属性求最大值
        //DiagnosisStandard standard = standards.stream().max(Comparator.comparing(DiagnosisStandard::getOrderNum)).get();

        // 8. 最大值.max(无参数)
        // .mapToDouble(Object::property).max() 其实就是map(Object::property)选出自己想要的属性,变成新的list之后在.max()
        //questionItemMaxScore = questionItems.stream().mapToDouble(QuestionMultipleType::getScore).max().getAsDouble();

        // 9. 按照某种条件查找第一次出现的位置 filter() + findFirst()
        Integer index = ids.stream().filter(k -> (k>2)).findFirst().get();
        log.info(index.toString());

        // 10. reduce()合并操作通常和map()一起用 --> map reduce
        // 发票集合
        List<Invoice> invoices = Arrays.asList(
                new Invoice("A01", BigDecimal.valueOf(9.99), BigDecimal.valueOf(1), 1.1D),
                new Invoice("A02", BigDecimal.valueOf(19.99), BigDecimal.valueOf(1.5), 2.2D),
                new Invoice("A03", BigDecimal.valueOf(4.99), BigDecimal.valueOf(2), 3.3D)
        );
        // map-reduce求和【.reduce(BigDecimal.ZERO, BigDecimal::add)】
        //【map()操作得到只要一个基本元素的stream】-->【reduce()操作的对象也只能是有一个基本元素的stream才可以】
        BigDecimal sum1 = invoices.stream()
                .map(x -> x.getQuantity().multiply(x.getPrice()))       // map,对集合中的元素进行操作得到只有基本元素的stream,而不是有复杂对象的stream
                .reduce(BigDecimal.ZERO, BigDecimal::add);              // reduce,将上一步得到的结果进行合并得到最终的结果
        // 结果 49.955
        System.out.println(sum1);
        // 使用setScale方法进行四舍五入 49.955 -> 49.96
        System.out.println(sum1.setScale(2, RoundingMode.HALF_UP));

        // 11. map-reduce对list中某个Double元素的求和【.reduce(Double::sum)】
        Double doubleSum = invoices.stream()
                .map(q -> q.getValue())
                .reduce(Double::sum)
                .get();
        log.info("---使用map-reduce-对stream中的元素求和---"+doubleSum);

        // 12. map-reduce 可以对计算进行初值的赋值,也可以不赋值,默认为空即可
        //T reduce(T identity, BinaryOperator<T> accumulator);
        // 1)identity:它允许用户提供一个循环计算的初始值
        // 2)accumulator:方法签名为apply(T t,U u)
        //    方法中第一个参数t为上次函数计算的返回值
        //    第二个参数u为Stream中的元素,这个函数把这两个值计算apply,得到的new-value值会被赋值给下次执行这个方法的第一个参数t
        System.out.println("给定个初始值,求和");   // 初值为100 计算过程为100+1+2+3+4=110 【i就是(1,2,3,4)集合中的每个元素】
        System.out.println(Stream.of(1, 2, 3, 4).reduce(100, (sum, i) -> sum + i));
        System.out.println(Stream.of(1, 2, 3, 4).reduce(100, Integer::sum));
        System.out.println("给定个初始值,求min");  // 初值为100  比较过程为Math.min(100, 1)-->min=1; Math.min(1, 2)-->min=1; Math.min(1, 3)-->min=1; ...
        System.out.println(Stream.of(1, 2, 3, 4).reduce(100, (min, i) -> Math.min(min, i)));
        System.out.println(Stream.of(1, 2, 3, 4).reduce(100, Integer::min));
        System.out.println("给定个初始值,求max");
        System.out.println(Stream.of(1, 2, 3, 4).reduce(100, (max, i) -> Math.max(max, i)));
        System.out.println(Stream.of(1, 2, 3, 4).reduce(100, Integer::max));
        //Optional<T> reduce(BinaryOperator<T> accumulator);
        // 注意返回值,上面的返回是T,泛型,传进去啥类型,返回就是啥类型。
        // 下面的返回的则是Optional类型
        System.out.println("无初始值,求和");
        System.out.println(Stream.of(1, 2, 3, 4).reduce(Integer::sum).orElse(0));
        System.out.println("无初始值,求max");
        System.out.println(Stream.of(1, 2, 3, 4).reduce(Integer::max).orElse(0));
        System.out.println("无初始值,求min");
        System.out.println(Stream.of(1, 2, 3, 4).reduce(Integer::min).orElse(0));

        // 13. peek是中间操作,不是终结操作(如forEach count collect),其返回值还是Stream
        // peek: 生成一个包含原Stream的所有元素的新Stream,同时会提供一个消费函数(Consumer实例),新Stream每个元素被消费的时候都会执行给定的消费函数;
        Stream.of("one", "two", "three", "four")
                .peek(e -> System.out.println("-----Peeked value: " + e))
                .map(String::toUpperCase)
                .peek(e -> System.out.println("-----Mapped value: " + e))
                .collect(Collectors.toList());
    }

Entity Invoice

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Invoice {

    // 发票号码
    String invoiceNo;

    // 价格
    BigDecimal price;

    // 数量
    BigDecimal quantity;

    // Double类型数据
    Double value;
}

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Province {

    String name;

    List<String> city;

}

flatMap()

public calss Province{

	String name;

	List<String> city;

}

List<String> beijingcities = new ArrayList(Arrays.asList("海淀", "朝阳"));
List<String> shanghaicities = new ArrayList(Arrays.asList("静安", "闵行"));

List<Province> provinces = new ArrayList();
provinces.add("北京", beijingcities);
provinces.add("上海", shanghaicities);

provinces.stream().flatMap(a -> a.getCity().stream());
  • JSON.parseObject(string, Object.class) 使用.collect(Collectors.toList());做收集
  • JSON.parseArray(stringList, Object.class) 使用.collect(ArrayList::new, ArrayList::addAll, ArrayList::addAll);做收集
    @Test
    public void r(){
        String metricId = "1216d247-8534-4599-a19b-e97c86e793b1";
        String scaleId = "4a7e1689-082a-495c-9d75-bb4a01e0f125";
        // 1. JSON.parseObject(string, Object.class) parseOject只是反序列化得出一个Object对象
        List<DiagnosisStandard> standards = diagnosisStandardMapper.selectByScaleIdAndMetricId(metricId, scaleId);
        ArrayList<DiagnosisScoreRange> collect = (ArrayList<DiagnosisScoreRange>) standards.stream().map(a -> {
            DiagnosisScoreRange diagnosisScoreRange;
            // parseObject只得到一个对象,所有想要得到list需要.collect(Collectors.toList());
            diagnosisScoreRange = JSONObject.parseObject(a.getScoreRange(), DiagnosisScoreRange.class);
            return diagnosisScoreRange;
        }).collect(Collectors.toList());
        log.info("collect: "+JSON.toJSONString(collect));

		// parseObject和上边的相同,只是直接return parseObject后的对象,没有提前声明该对象
        ArrayList<DiagnosisScoreRange> collect1 = (ArrayList<DiagnosisScoreRange>) standards.stream().map(a -> {
            return JSONObject.parseObject(a.getScoreRange(), DiagnosisScoreRange.class);
        }).collect(Collectors.toList());
        log.info("collect1: "+JSON.toJSONString(collect1));

		// 2. JSON.parseArray(参数1为一个list对象的string, 参数2为.class)
		// .collect(ArrayList::new, ArrayList::addAll, ArrayList::addAll); 注意ArrayList::new
        ArrayList<DiagnosisScoreRange> collect2 = standards.stream().map(a -> {
            DiagnosisScoreRange diagnosisScoreRange = JSONObject.parseObject(a.getScoreRange(), DiagnosisScoreRange.class);
            List<DiagnosisScoreRange> list = new ArrayList<>();
            list.add(diagnosisScoreRange);
            String listString = JSON.toJSONString(list);
            // 所以需要注意参数是一个list的string:listString
            return JSON.parseArray(listString, DiagnosisScoreRange.class);
        }).collect(ArrayList::new, ArrayList::addAll, ArrayList::addAll);
        log.info("collect2: "+JSON.toJSONString(collect2));
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java8中stream()的使用案例 的相关文章

随机推荐

  • 强化学习算法 Policy Gradient 解决 CartPole 问题,代码逐条详解

    本文内容源自百度强化学习 7 日入门课程学习整理 感谢百度 PARL 团队李科浇老师的课程讲解 强化学习算法 DQN 解决 CartPole 问题 移动小车使得车上的摆杆保持直立 这个游戏环境可以说是强化学习中的 Hello World 大
  • 基于LayUI使用FullCalendar实现日程管理

    引言 最新工作中需要实现日程管理功能 由于技术选型 基于layui 限制 从网上对比查询最终选定使用FullCalendar插件来实现日程管理 其中对比的日程还有XgCalendar Google Calendar 实现效果 1 打开界面后
  • php--如何编写一个简易的论坛

    include3 php 数据库连接 function doDB global conn3 conn3 mysqli connect localhost root php project01 if mysqli connect errno
  • 通用视觉大模型综述

    背景 近两年视觉大模型发展很快 各家公司已经训练出自己的视觉大模型 包括微软的 swin transformer 系列 Google 的 vit 系列以及 150 亿参数量的 V MOE 模型 从paperwithcode榜单上可以看到 目
  • STM32HAL库CubeMX配置ADC多通道选择读取(非DMA)

    CubeMX配置ADC多通道选择读取 非DMA 最近在做项目时需要stm32f103分别读取角度传感器值和电压值 采用HAL库 CubeMX方式并没有找到像标准库一样直接可以调用ADC RegularChannelConfig 函数选择AD
  • 基于Spring + Spring MVC + Mybatis 高性能web构建

    原文地址 http blog csdn net zoutongyuan article details 41379851 参考地址 http blog csdn net gebitan505 article details 44455235
  • @PathVariable注解的简单使用,常用于restful传参

    1 测试代码的控制层 GetMapping getChapterInfo1 id name public R getChapterInfo1 PathVariable id String chapterId PathVariable nam
  • 秒杀系统(二)——商品模块展示技术难点

    秒杀系统 商品模块展示技术难点 商品详情页 商品详情页是展示商品详细信息的一个页面 承载在网站的大部分流量和订单的入口 京东商城目前有通用版 全球购 闪购 易车 惠买车 服装 拼购 今日抄底等许多套模板 各套模板的元数据是一样的 只是展示方
  • 设备全生命周期管理系统软件平台

    设备全生命周期管理系统软件平台 设备全生命周期管理系统构建设备全生命周期管理平台是解决当下设备管理问题 实现设备效能利用最优化的重要举措 设备全生命周期管理系统哪些特点 设备全生命周期管理系统传统意义上的设备管理工具或软件 往往局限在业务层
  • 如何利用Python中实现高效的网络爬虫

    目录 怎么提高爬虫效率 代码示例 使用合适的库 并发和异步 使用缓存 优化请求频率 错误处理和重试 测试和调优 注意事项 在数字化时代 网络爬虫已成为获取和分析数据的重要工具 Python作为一种功能强大的编程语言 拥有丰富的库和工具 可以
  • MATLAB小技巧(14)三角函数作图

    MATLAB小技巧 14 三角函数作图 前言 一 MATLAB仿真 二 仿真结果 三 小结 前言 MATLAB进行图像处理相关的学习是非常友好的 可以从零开始 对基础的图像处理都已经有了封装好的许多可直接调用的函数 这个系列文章的话主要就是
  • win7/win10安装Ubuntu20.04双系统详细操作步骤

    0 磁盘分区 我的电脑 右键 管理 磁盘管理 选择一个盘 安装Ubuntu 我选的是F盘 右键 压缩卷 选择压缩大小 20G以上 1 Ubuntu安装包下载 方法一 官网下载20 04最新版本 URL https ubuntu com 方法
  • 数据库课程设计------书店管理系统

    书店会员管理系统 具体的效果图看博客 书店管理系统2 https blog csdn net qq 45981397 article details 124062654 spm 1001 2014 3001 5502 需求分析 1 信息需求
  • oracle游标双循环

    oracle双循环 循环资源表 T SYS RESOURCE 和角色表 T SYS ROLE 插入角色资源表t sys role resource declare a表游标定义 cursor a SYS RESOURCE cur is SE
  • 傻白入门芯片设计,史上最最最全DRAM介绍(十二)

    目录 1 DRAM单元阵列 1 1 DRAM基本单元 1 2 cell阵列 1 3 cell阵列的读取 1 4 DRAM刷新 2 DRAM芯片的读写 2 1 必须的周围逻辑 2 2 完整的读过程 重点 2 3 完整的写过程 2 4 时间消耗
  • javascript 数组一键乱序

    方法1 给数组原生的sort方法传入一个函数 此函数随机返回1或 1 达到随机排列数组元素的目的 const arr1 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 const shuffleArray arr g
  • MAC机后端开发必备

    开篇 相信很多日常使用 MAC 进行软件开发的同学会有一种感受 在换 MAC 机的时候 拿到的都是一些裸系统 有一些常用必备的软件需要重新来安装一遍 我也遇到几次这样的问题 发现每次配置开发环境时都要安装这么几个方便好用的工具 在这总结一下
  • 获取url中的参数

    获取url 后的参数 location对象 含有当前URL的信息 属性 href 整个URL字符串 protocol 含有URL第一部分的字符串 如http host 包含有URL中主机名 端口号部分的字符串 如 www cenpok ne
  • 使用openssl_encrypt方法替代mcrypt_encrypt做AES加密

    mcrypt encrypt在php7 1中已被废弃 需要使用openssl encrypt代替 mdecrypt generic版 public function encrypt cbc str iv encryptKey module
  • java8中stream()的使用案例

    Test public void t1 List