簡體   English   中英

如何轉換列表<object>至 Map<k, v> 使用 java stream<div id="text_translate"><p> 我想將List&lt;ObjectInList&gt;轉換為Map&lt;K, V&gt;</p><pre> class ObjectInList { List&lt;Long&gt; listWithLong; Map&lt;String, Object&gt; dataMap; // there is 'id' key, and i want to use this id as key in map to be converted }</pre><p> 新的 map 格式如下</p><pre>String type; // this type is value of dataMap. List&lt;Long&gt; contents</pre><p> List&lt;Object&gt;中的每個 Object 都可以有重復的類型</p><p>例如</p><pre>///////// before converted //////////// [ { list: [1,2,3], dataMap: { type: "a", } }, { list: [4,5,6], dataMap: { type: "b", } }, { list: [7,8], dataMap: { type: "a", } }, ] ///////////// after converted ////////// { "a": [1,2,3,7,8], "b": [4,5,6] }</pre></div></k,></object>

[英]How to convert LIst<Object> to Map<K, V> with using java stream

我想將List<ObjectInList>轉換為Map<K, V>

class ObjectInList {
    List<Long> listWithLong;
    Map<String, Object> dataMap; // there is 'id' key, and i want to use this id as key in map to be converted
}

新的 map 格式如下

String type; // this type is value of dataMap.
List<Long> contents

List<Object>中的每個 Object 都可以有重復的類型

例如

///////// before converted ////////////
[
 {
    list: [1,2,3],
    dataMap: {
      type: "a",
    }
 },
 {
    list: [4,5,6],
    dataMap: {
      type: "b",
    }
 },
 {
    list: [7,8],
    dataMap: {
      type: "a",
    }
 },
]
///////////// after converted //////////
{
  "a": [1,2,3,7,8],
  "b": [4,5,6]
}

您可以使用groupingBytype分組,使用flatMapping來展平Long數據列表並收集為單個列表。

Map<String, List<Long>> res = 
   objectInList
    .stream()
    .collect(Collectors.groupingBy(
                       e -> e.getDataMap().get("type"),
                       Collectors.flatMapping(
                                  e -> e.getListWithLong().stream(),
                                  Collectors.toList())
     ));

我不確定你為什么需要Map<String, Object> dataMap; 當它應該只有一個值時。 為簡單起見,我已將您的ObjectInList class 修改為

class ObjectInList {
  List<Long> listWithLong;
  String type; 
}

要獲得分組列表,我們可以這樣做 -

Map<String, List<Long>> grouped =
    objectInLists.stream()
        .collect(
            Collectors.toMap(
                ObjectInList::getType,
                ObjectInList::getListWithLong,
                (oldList, newList) -> {
                  oldList.addAll(newList);
                  return oldList;
                }));

解釋:

toMap方法 -

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

toMap采用keyMapper ,它是ObjectInList::getType (根據類型進行分組), valueMaper 是ObjectInList::getListWithLong ,因為我們有重復的鍵,我們需要提供一個mergeFunction作為(oldList, newList) -> {oldList.addAll(newList);return oldList;}

從文檔 -

合並 function,用於解決與同一鍵關聯的值之間的沖突,如提供給 {@link Map#merge(Object, Object, BiFunction)

Java 8 轉換一個List<object> 至 Map<k,v> 使用對象的孩子的領域?<div id="text_translate"><p> 情況很簡單:我有一個 object List&lt;ParentClass&gt; list並想將其轉換為Map&lt;orderKey, price&gt;</p><p> class 如下所示</p><pre>class ParentClass{ Child1Class a; Child2Class b; }</pre><p> orderKey class 看起來像這樣</p><pre>class orderKey{ String id; String itemName; }</pre><p> 兒童班是這樣的</p><pre>class Child1Class{ String id; String itemName; Date date; ..... } class Child2Class{ BigDecimal price; .... }</pre><p> 所有的類都有對應每個字段的 getter 和 setter。 所以我本質上是想 map 孩子們的領域。 我怎樣才能做到這一點?</p><pre> -----------------------------MY ATTEMPT IS SOMETHING LIKE THIS-------------------------------------- list.stream(). .collect(Collectors.toMap(ParentClass::getA, ParentClass::getB).entrySet().stream()...... then I'm stuck</pre><p> 不知道如何構建臨時 object orderKey作為新 map 的密鑰。 任何幫助,將不勝感激。</p></div></k,v></object>

[英]Java 8 convert a List<Object> to Map<K,V> using the fields of the object's children?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 轉換清單 <Object> 到地圖 <K,V> 在java中 如何使用java 8將Stream <Map <K,V >>收集到Map <K,List <V >>中? 轉換清單 <V> 在地圖上 <K,V> 與流Java 8 如何使用Java流API將Collection <Pair <K,Collection <V >>轉換為List <MyObject <K,V >>? Java 8轉換地圖 <K, List<V> &gt;到地圖 <V, List<K> &gt; Java 8 轉換一個List<object> 至 Map<k,v> 使用對象的孩子的領域?<div id="text_translate"><p> 情況很簡單:我有一個 object List&lt;ParentClass&gt; list並想將其轉換為Map&lt;orderKey, price&gt;</p><p> class 如下所示</p><pre>class ParentClass{ Child1Class a; Child2Class b; }</pre><p> orderKey class 看起來像這樣</p><pre>class orderKey{ String id; String itemName; }</pre><p> 兒童班是這樣的</p><pre>class Child1Class{ String id; String itemName; Date date; ..... } class Child2Class{ BigDecimal price; .... }</pre><p> 所有的類都有對應每個字段的 getter 和 setter。 所以我本質上是想 map 孩子們的領域。 我怎樣才能做到這一點?</p><pre> -----------------------------MY ATTEMPT IS SOMETHING LIKE THIS-------------------------------------- list.stream(). .collect(Collectors.toMap(ParentClass::getA, ParentClass::getB).entrySet().stream()...... then I'm stuck</pre><p> 不知道如何構建臨時 object orderKey作為新 map 的密鑰。 任何幫助,將不勝感激。</p></div></k,v></object> Java 8 流映射<K,V>列出<T> Java-8:Stream如何在地圖上進行轉換 <K, List<D> &gt;到地圖 <D, List<K> &gt; 如何轉換列表<V>進入地圖<K, List<V> &gt;,使用 Java 8 流和自定義 List 和 Map 供應商? 使用Java Stream API將類型X轉換為Map <K,Map <V,X >>中的Y.
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM