Loading

flatMap Optional

    public static void main(String[] args) {
        // 获取每个人员,每年的最新成绩
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>() {{
            add(new HashMap<String, Object>(4) {{ put("name", "张三");put("year", 2021);put("score", 8.6);put("date", "2021-10-01"); }});
            add(new HashMap<String, Object>(4) {{ put("name", "张三");put("year", 2021);put("score", 9.1);put("date", "2021-12-01"); }});
            add(new HashMap<String, Object>(4) {{ put("name", "张三");put("year", 2022);put("score", 9.7);put("date", "2022-07-01"); }});
            add(new HashMap<String, Object>(4) {{ put("name", "李四");put("year", 2022);put("score", 5.5);put("date", "2022-07-01"); }});
            add(new HashMap<String, Object>(4) {{ put("name", "李四");put("year", 2022);put("score", 7.7);put("date", "2022-09-01"); }});
        }};

        List<Map<String, Object>> collect =
                list.stream().collect(
                                /*
                                 * 拿到list信息
                                 *      1、先按人员年份进行分组;
                                 *      2、再返回每年中时间最新的数据。
                                 */
                                Collectors.groupingBy(
                                        map -> map.get("name").toString() +
                                                map.get("year"),
                                        Collectors.maxBy(Comparator.comparing(map -> map.get("date").toString()))
                                )).values().stream()
                        /*
                         * flatMap(将各个生成流扁平化为单个流):
                         *      分组groupingBy,会将lisPacsInfoList划分为多个流,
                         *      flatMap方法把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流。
                         */
                        .flatMap(part -> toList(part).stream())
                        .collect(Collectors.toList());
        for (Map<String, Object> map : collect) {
            System.out.println(map);
        }
    }

    /**
     * 调用此静态方法,将 Optional(对象容器) 转换为  List/Set 方法。
     *
     * @param option option
     * @param <T>    容器内对象类型
     * @return list集合
     */
    public static <T> List<T> toList(Optional<T> option) {
        return option.
                map(Collections::singletonList).
                orElse(Collections.emptyList());
    }


    public static <R, A, T> R collect(Optional<T> option, Collector<? super T, A, R> collector) {
        final A container = collector.supplier().get();
        option.ifPresent(v -> collector.accumulator().accept(container, v));
        return collector.finisher().apply(container);
    }
posted @ 2022-11-17 11:41  溫柔の風  阅读(19)  评论(0编辑  收藏  举报