簡體   English   中英

如何使用Java Streams為HashMap的多個鍵插入相同的值

[英]How to insert the same value for multiple keys of an HashMap using Java Streams

假設我有一個HashMap,我想將相同的值插入到一個鍵列表中。 如何在不迭代所有鍵並插入值的情況下使用Java 8執行此操作? 這更像是一個Java Streams問題。

這是直截了當的做法。 這是我編寫的示例代碼,用於演示我想要實現的目標。

public void foo(List<String> keys, Integer value) {
    Map<String, Integer> myMap = new HashMap<>(); 
    for (String key : keys) {
        myMap.put(key, value);
    }
}

有沒有更簡單的方法使用Java 8流進行上述操作? 如何避免使用Java 8流的for循環。 謝謝!

[Edit-1]下面是一個更好的代碼片段。

public void foo() {
    Map<String, Integer> myMap = new HashMap<>(); 
    List<String> keys = getKeysFromAnotherFunction();
    Integer value = getValueToBeInserted(); // Difficult to show my actual use case. Imagine that some value is getting computed which has to be inserted for the keys.
    for (String key : keys) {
        myMap.put(key, value);
    }  

    List<String> keys2 = getNextSetOfKeys();
    Integer newValue = getValueToBeInserted(); 
    for (String key : keys2) {
        myMap.put(key, newValue);
    } 
}

使用收集器,如:

Map<String, Integer> myMap = keys.stream()
            .collect(Collectors.toMap(key -> key,
                    val -> value, (a, b) -> b));

我認為你的問題是將一些代碼分解出來而不是將傳統的for循環轉換為流構造。

假設您具有以下通用實用程序方法:

public static <K, V, M extends Map<K, V>> M fillMap(
        Supplier<List<K>> keysFactory,
        Supplier<V> singleValueFactory,
        Supplier<M> mapFactory) {

    M map = mapFactory.get();
    List<K> keys = keysFactory.get();
    V singleValue = singleValueFactory.get();

    keys.forEach(k -> map.put(k, singleValue));

    return map;
}

然后,您可以使用以下方法:

Map<String, Integer> myMap = fillMap(() -> getKeysFromAnotherFunction(),
                                     () -> getValueToBeInserted(),
                                     HashMap::new); // create HashMap

myMap = fillMap(() -> getNextSetOfKeys(),
                () -> getValueToBeInserted(),
                () -> myMap); // use previously created map

上面的代碼有變種,即該方法可以接收Map<K, V>實例而不是Supplier<Map<K, V>> ,或者甚至可能超載以支持兩種變體。

暫無
暫無

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

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