最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中List轉Map List實現(xiàn)的幾種姿勢

 更新時間:2022年06月02日 09:23:57   作者:一灰灰  
本文主要介紹了Java中List轉Map List實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

今天介紹一個實用的小知識點,如何將List轉為Map<Object, List<Object>>

1. 基本寫法

最開始介紹的當然是最常見、最直觀的寫法,當然也是任何限制的寫法

// 比如將下面的列表,按照字符串長度進行分組
List<String> list = new ArrayList<>();
list.add("hello");
list.add("word");
list.add("come");
list.add("on");
Map<Integer, List<String>> ans = new HashMap<>();

for(String str: list) {
? ? List<String> sub = ans.get(str.length());
? ? if(sub == null) {
? ? ? ? sub = new ArrayList<>();
? ? ? ? ans.put(str.length(), sub);
? ? }
? ? sub.add(str);
}
System.out.println(ans);

對于jdk8+,上面for循環(huán)中的內容可以利用Map.computeIfAbsent來替換,具體寫法如下

for (String str : list) {
? ? ans.computeIfAbsent(str.length(), k -> new ArrayList<>()).add(str);
}

當然既然已經是jdk1.8了,借助Stream的流處理,可以將上面的更一步進行簡化,如下

Map<Integer, List<String>> ans = list.stream().collect(Collectors.groupingBy(String::length));

2. 通用方法

上面是針對特定的列表,針對業(yè)務進行開發(fā)轉換,那么我們接下來嘗試構建一個通用的工具類

這里我們主要借助的知識點就是泛型,一個重要的點就是如何獲取Map中的key
對于jdk < 1.8的寫法,通過接口來定義實現(xiàn)key的獲取姿勢

public static <K, V> Map<K, List<V>> toMapList(List<V> list, KeyFunc<V, K> keyFunc) {
? ? Map<K, List<V>> result = new HashMap<>();
? ? for (V item: list) {
? ? ? ? K key = keyFunc.getKey(item);
? ? ? ? if (!result.containsKey(key)) {
? ? ? ? ? ? result.put(key, new ArrayList<>());
? ? ? ? }
? ? ? ? result.get(key).add(item);
? ? }
? ? return result;
}

public static interface KeyFunc<T, K> {
? ? K getKey(T t);
}

使用demo如下

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("hello");
    list.add("word");
    list.add("come");
    list.add("on");
    Map<Integer, List<String>> res = toMapList(list, new KeyFunc<String, Integer>() {
        @Override
        public Integer getKey(String s) {
            return s.length();
        }
    });
    System.out.println(res);
}

接下來再看一下jdk1.8之后的寫法,結合stream + 函數方法來實現(xiàn)

public static <K, V> Map<K, List<V>> toMapList(List<V> list, Function<V, K> func) {
    return list.stream().collect(Collectors.groupingBy(func));
}

其對應的使用方式則如下

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("hello");
    list.add("word");
    list.add("come");
    list.add("on");
    Map<Integer, List<String>> res = toMapList(list, (Function<String, Integer>) String::length);
    System.out.println(res);
}

3. 工具類

上一節(jié)介紹了基于泛型 + jdk8 Stream + 函數方法來實現(xiàn)通用轉換工具類的實現(xiàn)姿勢,接下來我們小結一下,輸出一個適用于1.8之后的工具類

/**
?* List<V>轉換為Map<K, List<V>> 特點在于Map中的value,是個列表,且列表中的元素就是從原列表中的元素
?*
?* @param list
?* @param func 基于list#item生成Map.key的函數方法
?* @param <K>
?* @param <V>
?* @return
?*/
public static <K, V> Map<K, List<V>> toMapList(List<V> list, Function<V, K> func) {
? ? return list.stream().collect(Collectors.groupingBy(func));
}

/**
?* List<I>轉換為Map<K, List<V>> 特點在于Map中的value是個列表,且列表中的元素是由list.item轉換而來
?*
?* @param list
?* @param keyFunc 基于list#item生成的Map.key的函數方法
?* @param valFunc 基于list#item轉換Map.value列表中元素的函數方法
?* @param <K>
?* @param <I>
?* @param <V>
?* @return
?*/
public static <K, I, V> Map<K, List<V>> toMapList(List<I> list, Function<I, K> keyFunc, Function<I, V> valFunc) {
? ? return list.stream().collect(Collectors.groupingBy(keyFunc, Collectors.mapping(valFunc, Collectors.toList())));
}

4.guava HashMultimap擴展知識點

最后再介紹一個擴展知識點,Gauva工具包中提供了一個HashMultimap的工具類,他的使用姿勢和我們平常的Map并無差別,但是需要在注意的是,它的value是個集合

List<String> list = new ArrayList<>();
list.add("hello");
list.add("word");
list.add("come");
list.add("on");
list.add("on");
HashMultimap<Integer, String> map = HashMultimap.create();
for (String item: strList) {
    map.put(item.length(), item);
}
System.out.println(map);

實際輸出如下,驗證了value實際上是個集合(on只有一個,如果是我們上面的工具類,會輸出兩個)

{2=[on], 4=[word, come], 5=[hello]}

到此這篇關于Java中List轉Map List實現(xiàn)的幾種姿勢的文章就介紹到這了,更多相關Java中List轉Map List內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • mybatisPlus返回Map類型的集合

    mybatisPlus返回Map類型的集合

    本文主要介紹了mybatisPlus返回Map類型的集合,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • java如何實時動態(tài)獲取properties文件的內容

    java如何實時動態(tài)獲取properties文件的內容

    這篇文章主要介紹了java如何實時動態(tài)獲取properties文件的內容,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring運行環(huán)境Environment的解析

    Spring運行環(huán)境Environment的解析

    本文主要介紹了Spring運行環(huán)境Environment的解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-08-08
  • java中for循環(huán)執(zhí)行的順序圖文詳析

    java中for循環(huán)執(zhí)行的順序圖文詳析

    關于java的for循環(huán)想必大家非常熟悉,它是java常用的語句之一,這篇文章主要給大家介紹了關于java中for循環(huán)執(zhí)行順序的相關資料,需要的朋友可以參考下
    2021-06-06
  • JAVA輸出流與輸入流代碼實例

    JAVA輸出流與輸入流代碼實例

    這篇文章主要介紹了JAVA輸出流與輸入流代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Java:詳解Java中的異常

    Java:詳解Java中的異常

    這篇文章主要介紹了java中的異常,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2021-08-08
  • SpringCloud升級2020.0.x版之OpenFeign簡介與使用實現(xiàn)思路

    SpringCloud升級2020.0.x版之OpenFeign簡介與使用實現(xiàn)思路

    在微服務系統(tǒng)中,我們經常會進行 RPC 調用。在 Spring Cloud 體系中,RPC 調用一般就是 HTTP 協(xié)議的調用。對于每次調用,都要經過一系列詳細步驟,接下來通過本文給大家介紹SpringCloud OpenFeign簡介與使用,感興趣的朋友一起看看吧
    2021-10-10
  • 使用Spring啟動時運行自定義業(yè)務

    使用Spring啟動時運行自定義業(yè)務

    這篇文章主要介紹了使用Spring啟動時運行自定義業(yè)務的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java 使用json-lib處理JSON詳解及實例代碼

    Java 使用json-lib處理JSON詳解及實例代碼

    這篇文章主要介紹了Java 使用json-lib處理JSON詳解及實例代碼的相關資料,需要的朋友可以參考下
    2017-02-02
  • Jenkins插件pipeline原理及使用方法解析

    Jenkins插件pipeline原理及使用方法解析

    這篇文章主要介紹了Jenkins插件pipeline原理及使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11

最新評論

岐山县| 东方市| 永顺县| 津南区| 肃宁县| 沭阳县| 衡南县| 固镇县| 安义县| 长岛县| 樟树市| 延吉市| 邵武市| 慈利县| 宁国市| 宁津县| 弋阳县| 左权县| 都江堰市| 康平县| 两当县| 新密市| 盘山县| 卓尼县| 芦溪县| 上思县| 太和县| 白城市| 苍溪县| 太仆寺旗| 安龙县| 永胜县| 会昌县| 文昌市| 玛纳斯县| 华容县| 松潘县| 临潭县| 榆社县| 太原市| 龙井市|