IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Stream之collect汇总的使用 -> 正文阅读

[移动开发]Stream之collect汇总的使用

在这里插入图片描述

@Test
    public void collectTest(){

        @Data
        @AllArgsConstructor
        class Order{
            private Integer id;
            private String account;
            private Integer productCount;
            private Double totalAmount;
        }

        List<Order> list = new ArrayList<>();
        list.add(new Order(1, "gyp", 2, 25.12));
        list.add(new Order(2, "gyp",5, 257.23));
        list.add(new Order(3, "zhangsan",3, 23332.12));
        list.add(new Order(4, "zhangsan",3, 23332.12));

        /*
        需求:根据一批订单信息,计算每个用户的平均商品价格
        这要求要按照用户账号进行分类,Map<账号,订单>  其中订单代表【产品数量】和【总金额】  即Map< String , Order >
         */
        Map<String, Order> collect = list.stream()
        		.parallel() //有parallel()才会执行并发部分代码
                .collect(
                        //参数一:对存储初始化结果的容器进行定义
                        () -> {
                            return new HashMap<String, Order>();
                        },
                        //参数2:添加元素时候的执行逻辑
                        (HashMap<String, Order> map, Order newOrder) -> {
                            String account = newOrder.getAccount();
                            if (map.containsKey(account)) {
                                //账号已存在时怎么处理
                                Order order = map.get(account);
                                order.setProductCount(
                                        order.getProductCount()
                                                + newOrder.getProductCount());
                                order.setTotalAmount(
                                        order.getTotalAmount()
                                                + newOrder.getTotalAmount()
                                );
                            } else {
                                //账号不存在时怎么处理
                                map.put(account, newOrder);
                            }
                        },
                        //参数3:并发执行时的逻辑
                        (HashMap<String, Order> map1, HashMap<String, Order> map2) -> {

                            map2.forEach(
                                    (key2, value2) -> {
                                        map1.merge(key2, value2, (order1, order2) -> {

                                            return new Order(0, key2,
                                                    order1.getProductCount()
                                                            + order2.getProductCount(),
                                                    order1.getTotalAmount()
                                                            + order2.getTotalAmount());
                                        });
                                    });
                        });

        System.out.println(JSON.toJSONString(collect,true));
    }

map.merge方法是jdk1.8才有的,看下源码:
key:map中的键,value:使用者传入的值,remappingFunction:BiFunction函数接口(该接口接收两个值,执行自定义功能并返回最终值)。

当map中不存在指定的key时,便将传入的value设置为key的值,当key存在值时,执行一个方法——该方法接收key的旧值和传入的value,执行自定义的方法返回最终结果,并将最终结果设置为key的值。

V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
        Objects.requireNonNull(remappingFunction);
        Objects.requireNonNull(value);
        V oldValue = get(key);
        V newValue = (oldValue == null) ? value :
                   remappingFunction.apply(oldValue, value);
        if(newValue == null) {
            remove(key);
        } else {
            put(key, newValue);
        }
        return newValue;
    }
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 16:26:11  更:2022-03-03 16:27:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 16:49:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码