欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中List轉(zhuǎn)Map List實(shí)現(xiàn)的幾種姿勢(shì)

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

今天介紹一個(gè)實(shí)用的小知識(shí)點(diǎn),如何將List轉(zhuǎn)為Map<Object, List<Object>>

1. 基本寫法

最開(kāi)始介紹的當(dāng)然是最常見(jiàn)、最直觀的寫法,當(dāng)然也是任何限制的寫法

// 比如將下面的列表,按照字符串長(zhǎng)度進(jìn)行分組
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);

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

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

當(dāng)然既然已經(jīng)是jdk1.8了,借助Stream的流處理,可以將上面的更一步進(jìn)行簡(jiǎn)化,如下

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

2. 通用方法

上面是針對(duì)特定的列表,針對(duì)業(yè)務(wù)進(jìn)行開(kāi)發(fā)轉(zhuǎn)換,那么我們接下來(lái)嘗試構(gòu)建一個(gè)通用的工具類

這里我們主要借助的知識(shí)點(diǎn)就是泛型,一個(gè)重要的點(diǎn)就是如何獲取Map中的key
對(duì)于jdk < 1.8的寫法,通過(guò)接口來(lái)定義實(shí)現(xiàn)key的獲取姿勢(shì)

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);
}

接下來(lái)再看一下jdk1.8之后的寫法,結(jié)合stream + 函數(shù)方法來(lái)實(shí)現(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));
}

其對(duì)應(yīng)的使用方式則如下

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 + 函數(shù)方法來(lái)實(shí)現(xiàn)通用轉(zhuǎn)換工具類的實(shí)現(xiàn)姿勢(shì),接下來(lái)我們小結(jié)一下,輸出一個(gè)適用于1.8之后的工具類

/**
?* List<V>轉(zhuǎn)換為Map<K, List<V>> 特點(diǎn)在于Map中的value,是個(gè)列表,且列表中的元素就是從原列表中的元素
?*
?* @param list
?* @param func 基于list#item生成Map.key的函數(shù)方法
?* @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>轉(zhuǎn)換為Map<K, List<V>> 特點(diǎn)在于Map中的value是個(gè)列表,且列表中的元素是由list.item轉(zhuǎn)換而來(lái)
?*
?* @param list
?* @param keyFunc 基于list#item生成的Map.key的函數(shù)方法
?* @param valFunc 基于list#item轉(zhuǎn)換Map.value列表中元素的函數(shù)方法
?* @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擴(kuò)展知識(shí)點(diǎn)

最后再介紹一個(gè)擴(kuò)展知識(shí)點(diǎn),Gauva工具包中提供了一個(gè)HashMultimap的工具類,他的使用姿勢(shì)和我們平常的Map并無(wú)差別,但是需要在注意的是,它的value是個(gè)集合

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);

實(shí)際輸出如下,驗(yàn)證了value實(shí)際上是個(gè)集合(on只有一個(gè),如果是我們上面的工具類,會(huì)輸出兩個(gè))

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

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

相關(guān)文章

  • 提升java開(kāi)發(fā)效率工具lombok使用爭(zhēng)議

    提升java開(kāi)發(fā)效率工具lombok使用爭(zhēng)議

    這篇文章主要介紹了提升java開(kāi)發(fā)效率工具lombok使用爭(zhēng)議到底該不該使用的分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 深入談?wù)刯ava的枚舉(enum)類型

    深入談?wù)刯ava的枚舉(enum)類型

    這篇文章介紹的是java中的枚舉類型,對(duì)于枚舉類型的相關(guān)知識(shí),我們也介紹過(guò)不少方面的內(nèi)容。希望本文能夠給你帶來(lái)幫助,下面來(lái)一起看看,有需要的可以參考借鑒。
    2016-09-09
  • jvm調(diào)優(yōu)的幾種場(chǎng)景(小結(jié))

    jvm調(diào)優(yōu)的幾種場(chǎng)景(小結(jié))

    本文主要介紹了jvm調(diào)優(yōu)的幾種場(chǎng)景,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Spring中配置和讀取多個(gè)Properties文件的方式方法

    Spring中配置和讀取多個(gè)Properties文件的方式方法

    本篇文章主要介紹了Spring中配置和讀取多個(gè)Properties文件的方式方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • maven創(chuàng)建spark項(xiàng)目的pom.xml文件配置demo

    maven創(chuàng)建spark項(xiàng)目的pom.xml文件配置demo

    這篇文章主要為大家介紹了maven創(chuàng)建spark項(xiàng)目的pom.xml文件配置demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Java如何通過(guò)枚舉實(shí)現(xiàn)有限狀態(tài)機(jī)

    Java如何通過(guò)枚舉實(shí)現(xiàn)有限狀態(tài)機(jī)

    這篇文章主要介紹了Java如何通過(guò)枚舉實(shí)現(xiàn)有限狀態(tài)機(jī),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 詳解MyBatis自定義Plugin插件

    詳解MyBatis自定義Plugin插件

    這篇文章主要介紹了MyBatis自定義Plugin插件的相關(guān)知識(shí),實(shí)現(xiàn)方法也很簡(jiǎn)單,只需實(shí)現(xiàn) Interceptor 接口,并指定想要攔截的方法簽名即可,需要的朋友可以參考下
    2018-06-06
  • java仿Servlet生成驗(yàn)證碼實(shí)例詳解

    java仿Servlet生成驗(yàn)證碼實(shí)例詳解

    這篇文章主要介紹了java仿Servlet生成驗(yàn)證碼實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 10種簡(jiǎn)單的Java性能優(yōu)化

    10種簡(jiǎn)單的Java性能優(yōu)化

    你是否正打算優(yōu)化hashCode()方法?是否想要繞開(kāi)正則表達(dá)式?Lukas Eder介紹了很多簡(jiǎn)單方便的性能優(yōu)化小貼士以及擴(kuò)展程序性能的技巧
    2017-11-11
  • Java+MySql圖片數(shù)據(jù)保存與讀取的具體實(shí)例

    Java+MySql圖片數(shù)據(jù)保存與讀取的具體實(shí)例

    之前一直沒(méi)有做過(guò)涉及到圖片存儲(chǔ)的應(yīng)用,最近要做的東東涉及到了這個(gè)點(diǎn),就做了一個(gè)小的例子算是對(duì)圖片存儲(chǔ)的初試吧
    2013-06-06

最新評(píng)論