• java Stream 常用语法


    toMap

    list.stream().collect(Collectors.toMap(bean::getKey, value->value));

    Map<Integer, AAA> map = list.stream().collect(Collectors.toMap(AAA::getA, t->t, (v1, v2)->v2, LinkedHashMap::new));

    看着一堆lamdba表达式,好像很难,其实很简单,api doc里各个参数的意义已经写的十分清楚了

    下面简单讲解下:

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

    keyMapper:让你提供一个获取key的lambda, 即 AAA::getA
    valueMapper:让你提供一个获取key的lambda,即e->e,原封不动的返回对象,也可以自己操作,
    mergeFunction :当遇到key冲突时的处理策略,(v1, v2)->v2,当冲突时,取后面的值覆盖前面的值,
    mapSupplier: 让你提供一个获取map的lambda,即LinkedHashMap::new

    坑1 ,

    直接使用 Collectors.toMap() 的话,有一个坑,就是 value 不能为 null,否则会报 NPE

    可以参考这篇博客:
    https://blog.csdn.net/weixin_41905537/article/details/105864504

    解释一下这几个参数的意思:

        <R> R collect(Supplier<R> supplier,
                      BiConsumer<R, ? super T> accumulator,
                      BiConsumer<R, R> combiner);
    

    supplier: map提供器,常用HashMap::new或者LinkedHashMap::new,也可以是别的自定义的map

    accumulator:数据收集器,注意第一个参数是范型R,是第一个参数supplier,提供出来的,即是一个map类型,第二个参数,就是list的item了,
    常见用法:(map, e) -> map.put(e.getId(),e)。将list的每个数据,以id为key,本身为value,塞入到map中

    combiner:数据组合器

    stream 中peek和 map的区别

    map可以改变返回值类型,而peek可修改数据,无法改变返回值类型

  • 相关阅读:
    codeforces 980A Links and Pearls
    zoj 3640 Help Me Escape
    sgu 495 Kids and Prizes
    poj 3071 Football
    hdu 3853 LOOPS
    hdu 4035 Maze
    hdu 4405 Aeroplane chess
    poj 2096 Collecting Bugs
    scu 4444 Travel
    zoj 3870 Team Formation
  • 原文地址:https://www.cnblogs.com/po-shi/p/14267236.html
Copyright © 2020-2023  润新知