首页 > 编程语言 > 详细

Java8-List转Map

时间:2020-12-02 23:15:05      阅读:27      评论:0      收藏:0      [点我收藏+]

vo

@Data
@AllArgsConstructor
public class DailyDataChartVo {

    /**
     * 日期
     */
    private LocalDate date;

    /**
     * 今日营收
     */
    private BigDecimal revenue;
}

Collectors.toMap()

public static <T, K, U, M extends Map<K, U>>
Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
                         Function<? super T, ? extends U> valueMapper,
                         BinaryOperator<U> mergeFunction,
                         Supplier<M> mapSupplier) {}

??Collectors.toMap()一共有三个重载方法,前两个参数都是Function接口,分别用来指定生成key和value的策略;第三个参数用来指定当key重复时的操作,如果未指定,当key重复时,直接抛出异常;第四个参数用来指定生成Map的类型,默认创建的是HashMap。

  1. 两个参数,key重复,直接抛出异常
Map<LocalDate, DailyDataChartVo> map = list.stream()
        .collect(Collectors.toMap(DailyDataChartVo::getDate, Function.identity()));
  1. 三个参数,重复key,保留旧值
Map<LocalDate, DailyDataChartVo> map = list.stream()
        .collect(Collectors.toMap(DailyDataChartVo::getDate, Function.identity(), (c1, c2) -> c1));
  1. 四个参数,指定返回TreeMap
Map<LocalDate, DailyDataChartVo> map = list.stream()
        .collect(Collectors.toMap(DailyDataChartVo::getDate, Function.identity(), (c1, c2) -> c1, TreeMap::new));

Collectors.groupingBy()

public static <T, K> Collector<T, ?, Map<K, List<T>>>
groupingBy(Function<? super T, ? extends K> classifier) {
    return groupingBy(classifier, toList());
}
public static <T, K, A, D>
Collector<T, ?, Map<K, D>> groupingBy(Function<? super T, ? extends K> classifier,
                                      Collector<? super T, A, D> downstream) {
    return groupingBy(classifier, HashMap::new, downstream);
}

??Collectors.groupingBy()也是三个重载方法,第一个参数是一个Function接口,用来指定分组的策略;第二个参数用来指定生成Map的类型,默认创建的是HashMap;第三个参数是一个收集器,指定对流中元素的收集策略。

  1. 一个参数,按日期分组
Map<LocalDate, List<DailyDataChartVo>> map = list.stream()
        .collect(Collectors.groupingBy(DailyDataChartVo::getDate));
  1. 两个参数,可以指定流的收集策略
  • eg:按日期分组,统计每组的元素个数
Map<LocalDate, Long> map = list.stream()
        .collect(Collectors.groupingBy(DailyDataChartVo::getDate, Collectors.counting()));
  • eg:按日期分组,仅收集每组元素的金额
Map<LocalDate, List<BigDecimal>> map = list.stream()
        .collect(Collectors.groupingBy(DailyDataChartVo::getDate,
                Collectors.mapping(DailyDataChartVo::getRevenue, Collectors.toList())));
  • eg:按日期分组,汇总每组元素的金额总和
Map<LocalDate, BigDecimal> map = list.stream()
        .collect(Collectors.groupingBy(DailyDataChartVo::getDate,
                Collectors.mapping(DailyDataChartVo::getRevenue,
                        Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
  • eg:按日期分组,收集每组的第一个元素
Map<LocalDate, DailyDataChartVo> map = list.stream()
                .collect(Collectors.groupingBy(DailyDataChartVo::getDate,
                        Collectors.collectingAndThen(Collectors.toList(), c -> c.get(0))));
  1. 三个参数,指定返回LinkedHashMap
LinkedHashMap<LocalDate, List<DailyDataChartVo>> map = list.stream()
                .collect(Collectors.groupingBy(DailyDataChartVo::getDate, LinkedHashMap::new, Collectors.toList()));

Java8-List转Map

原文:https://www.cnblogs.com/milete/p/14070775.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!