Возможный способ написать код ниже в Java 8 - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть код, который работает как требуется, но я хочу переписать его в Java 8.Этот код создаст карту. Каждому элементу списка будут выделены все серверы.

public static Map<String, List<String>> agg(){
        List<String> list = Arrays.asList("Item A", "Item B", "Item C");
        List<String> servers = Arrays.asList("Server A", "Server B", "Server C", "Server D");
        Map<String, List<String>> map = new HashMap<>();
        for (int i = 0; i < list.size(); i++) {
            ArrayList<String> temp = new ArrayList<>();
            for (int j = 0; j < servers.size(); j++) {
                temp.add(servers.get(j));
            }
            map.put(list.get(i), temp);
        }
        return map;
    }

Выход

Item C ::[Server A, Server B, Server C, Server D]
Item B ::[Server A, Server B, Server C, Server D]
Item A ::[Server A, Server B, Server C, Server D]

Каким будет лямбда-эквивалент?

Ответы [ 4 ]

0 голосов
/ 24 февраля 2019

Простой forEach подход будет

Map<String, List<String>> output = new HashMap<>();
list.forEach(s -> output.put(s, servers));
0 голосов
/ 23 февраля 2019

Попробуйте это:

list.stream()
            .map(item->new AbstractMap.SimpleEntry<>(item,servers))
            .collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));
0 голосов
/ 23 февраля 2019

Давайте упростим код перед его преобразованием в лямбда-выражения

 public static Map<String, List<String>> agg(){
    List<String> list = Arrays.asList("Item A", "Item B", "Item C");
    List<String> servers = Arrays.asList("Server A", "Server B", "Server C", "Server D");
    Map<String, List<String>> map = new HashMap<>();
    for (int i = 0; i < list.size(); i++) {
        map.put(list.get(i), new ArrayList<>(servers));
    }
    return map;
}

Я просто упростил создание копии массива.

Конвейер для преобразования из одной формы данных в другую в Java 8 содержитследующие шаги:

  1. stream
  2. map (преобразовать из формы в другую)
  3. lower (отфильтровать нежелательные значения)
  4. collect (собирать результаты)

Поскольку ваши данные не нужно преобразовывать, просто собирать их в другой структуре, карта и уменьшение не нужны

public static Map<String, List<String>> agg(){
    List<String> list = Arrays.asList("Item A", "Item B", "Item C");
    List<String> servers = Arrays.asList("Server A", "Server B", "Server C", "Server D");

    Function<String, String> keyFunction = key -> key;
    Function<String, List<String>> valueFunction = key -> new ArrayList<>(servers);

    return list.stream()
            .collect(Collectors.toMap(keyFunction, valueFunction));
}

Эти функции могут быть встроенными ирезультат будет:

    public static Map<String, List<String>> agg(){
    List<String> list = Arrays.asList("Item A", "Item B", "Item C");
    List<String> servers = Arrays.asList("Server A", "Server B", "Server C", "Server D");

    return list.stream()
            .collect(Collectors.toMap(key -> key, key -> new ArrayList<>(servers)));
}
0 голосов
/ 23 февраля 2019

Создайте поток ваших «элементов» и соберите их в карту, где ключи - это объекты из этого потока, а значения - копии списка серверов.

import java.util.*;
import java.util.function.*;
import java.util.stream.*;
import static java.util.stream.Collectors.toMap;

...

List<String> servers = Arrays.asList("Server A", "Server B", "Server C", "Server D");
Map<String, List<String>> map = Stream.of("Item A", "Item B", "Item C")
    .collect(toMap(Function.identity(), (__) -> new ArrayList<>(servers)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...