簡體   English   中英

無法將元組列表轉換為hashmap java

[英]Can't convert tuple list to hashmap java

我想將javax.persistence.Tuple轉換為HashMap ,但像這樣,它插入元組的最后一個元素並采用別名和數據類型。 我怎樣才能改進這個方法,以便它采用元組的值?

public Map<String, Object> tuplesToMap(List<Tuple> data){
    Map<String, Object> values = new HashMap<>();
    data.forEach(tuple -> {
        tuple.getElements().forEach(
            element -> {
                values.put(element.getAlias(), tuple.get(element));
            }
        );
    });
    return values;
}

使用 java 8 很簡單:

return data.stream()
    .collect(Collectors.toMap(
        t -> t.get(0, String.class),
        t -> t.get(1, Object.class)));

似乎正在工作:

public static List<Map<String/*UPPERCASE*/, Object>> jpaTuplesToMaps(
  List<javax.persistence.Tuple> data
){
    return data.stream()
        .map(tuple -> { // per each tuple of the input List
            // creating a new HashMap
            Map<String, Object> resultItem =  new HashMap<>();
            // filling the created HashMap with values of
            tuple.getElements().forEach( // each column of the tuple
                col -> { resultItem.put(col.getAlias(), tuple.get(col)); } 
            );
            // returning the created HashMap instead of  the current Tuple
            return resultItem;
        })
         // collecting & returning all the created HashMap-s as a List
        .collect(Collectors.toList());
}

但是通常需要單個和列表轉換,所以讓我們將它們組合起來:

public static Map<String/*UPPERCASE*/, Object> jpaTupleToMap(
    javax.persistence.Tuple data /*CASE INSENSITIVE*/
){
    Map<String, Object> result = 
        new HashMap<>(); // exactly HashMap since it can handle NULL keys & values
    data.getElements().forEach(
        col -> { result.put(col.getAlias(), data.get(col)); } 
    );
    return result;
}

//-------------------------
    
public static List<Map<String/*UPPERCASE*/, Object>> jpaTuplesToMaps(
    List<javax.persistence.Tuple> data /*CASE INSENSITIVE*/
){
    return data.stream() // List<Tuple> -> Tuple1,..TupleN
        .map(tuple -> jpaTupleToMap(tuple)) // Tuple1 -> HashMap1,..TupleN -> HashMapN
        .collect(Collectors.toList()); // HashMap1,..HashMapN -> List
}

您用作哈希映射鍵的element.getAlias()可能與某些元素相同。

Map鍵是唯一的,這意味着,如果您插入條目 (1, "one") 然后 (1, "two"),第一個值將被后者覆蓋。 如果您想將多個值映射到一個鍵,請使用Map<String, Collection<Object>>或來自 Guava 的Multimap ,這完全相同。

您可以使用此函數插入​​ multimap - 如果鍵不在地圖中,則創建一個新的ArrayList並將其添加到地圖中,否則返回現有的。 然后,將值插入列表:

values
    .computeIfAbsent(element.getAlias, k -> new ArrayList<>())
    .add(tuple.get(element));

暫無
暫無

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM