Как вставить одно и то же значение для нескольких ключей HashMap, используя потоки Java - PullRequest
3 голосов
/ 23 апреля 2019

Скажем, у меня есть 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?Как можно избежать цикла for с использованием потоков Java 8.Спасибо!

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

Ответы [ 2 ]

3 голосов
/ 23 апреля 2019

Использование коллектора, что-то вроде:

Map<String, Integer> myMap = keys.stream()
            .collect(Collectors.toMap(key -> key,
                    val -> value, (a, b) -> b));
0 голосов
/ 23 апреля 2019

Я думаю, что ваш вопрос заключается в том, чтобы выделить какой-то фрагмент кода больше, чем преобразовать традиционные циклы 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>>, или он может быть даже перегружен для поддержки обоих вариантов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...