简体   繁体   中英

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

Say I have a HashMap and I want to insert the same value to a list of keys. How can I do this with Java 8 without iterating through all the keys and inserting the value? This is more of a Java Streams question.

Here is the straight forward way of doing it. This is a sample code that I wrote to demonstrate what I wanted to achieve.

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

Is there a simpler way of doing the above using Java 8 streams? How can I avoid the for loop using Java 8 streams. Thanks!

[Edit-1] A better code snippet below.

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

Using collector, something like:

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

I think that your question is about factoring out some piece of code more than converting traditional for loops into stream constructs.

Suppose you have the following generic utility method:

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

Then, you could use the above method as follows:

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

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

There are variants for the code above, ie, the method could receive a Map<K, V> instance instead of a Supplier<Map<K, V>> , or it might even be overloaded to support both variants.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM