Java Stream Api обратная структура данных и нормализация переменных - PullRequest
0 голосов
/ 01 июля 2019

У меня есть Home класс.Существует массив этого класса, я должен преобразовать эту структуру данных как Map<AddressList, Number> с помощью Java Stream API.Значение Number будет повторяться для каждого адреса в том же Home объекте.Как мне это сделать?Спасибо.

class Home {
    private Long number;
    private List<String> addressList;
    // getters, setters, constructor
}

class AnotherClass {
    List<Home> homeList = ....;

    // do something here and result
    Map<String, Long> barcodeNumberMap = ...;
}

РЕШЕНИЕ

Спасибо за ваши ответы.Последний код;

public void test() {
    List<Home> homeList = new ArrayList<>();
    Home h = new Home();
    List<String> barcode1List = new ArrayList<String>();
    barcode1List.add("b11");
    barcode1List.add("b12");
    h.setBarcodeList(barcode1List);
    h.setNumber(100L);

    Home h2 = new Home();
    List<String> barcode2List = new ArrayList<String>();
    barcode2List.add("b21");
    barcode2List.add("b22");
    h2.setBarcodeList(barcode2List);
    h2.setNumber(200L);

    homeList.add(h);
    homeList.add(h2);

    Map<String, Long> resultMap = homeList.stream()
        .flatMap(home -> home.getBarcodeList().stream()
            .map(addr -> new SimpleEntry<String, Long>(addr, home.getNumber())))
        .collect(Collectors.toMap(SimpleEntry::getKey, SimpleEntry::getValue));

    System.out.println(resultMap);

    }

и вывод:

{b21 = 100, b12 = 200, b11 = 200, b22 = 100}

1 Ответ

1 голос
/ 01 июля 2019

Имея:

List<Home> homeList = ....;
... your work ...
Map<String, Long> barcodeNumberMap = ...;

Тогда первый вопрос должен быть о том, как заполнить последнюю карту.Это делается с помощью .collect(Collectors.toMap(keyGetter, valueGetter)).

Map<String, Long> result =
    some obj stream of string and long
    .collect(Collectors.toMap(obj::getString, obj::getLong);

Тогда homeList Home: длинная и много строк, должна быть сплющена.Какой из них сгладит 10 домов с 20 струнами до 200 пар длинных и струнных.Вероятно, можно предположить, что каждое значение String уникально.

A Stream<Pair<String, long>> будет выполнено, как

homeList.stream()
    .flatMap(home ->
         home.addressList.stream()
                          .map(addr -> Pair<String, Long>(addr, list.number)));

, если одна работа для внутреннего Дома наружу: Дом может быть превращенв Stream<Pair<String, Long>> и flatMap сглаживает несколько потоков.

Поскольку это кажется домашней работой, я остановлюсь здесь.

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