Java 8 Streams для итерации списка - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть HashMap, который содержит List<Dto> и List<List<String>>:

Map<List<Dto>, List<List<String>>> mapData = new HashMap();

и Arraylist<Dto>.

Я хочу перебрать эту карту, получитьkeys-key1, key2 и т. д., извлеките из него значение и установите его для объекта Dto, а затем добавьте его в список.Так что я могу успешно выполнять итерации с помощью foreach и добавлять его в списки, но не могу правильно выполнить его с помощью Java 8. Поэтому мне нужна помощь в этом.Вот пример кода

List<DTO> dtoList = new ArrayList();

DTO dto = new DTO();

mapData.entrySet().stream().filter(e->{
    if(e.getKey().equals("key1")){  
        dto.setKey1(e.getValue())
    }
    if(e.getKey().equals("key2")){  
        dto.setKey2(e.getValue())
    }
});

Здесь e.getValue() от List<List<String>>(), поэтому первое, что мне нужно, это перебрать его, чтобы установить значение.Во-вторых, мне нужно добавить dto в Arraylist dtoList.Итак, как этого добиться.

Базовый фрагмент, который я пробовал, не добавляя в HashMap, где List имеет ключи, multiList имеет значения, а Dto list - то, где я наконец добавляю в

for(List<Dto> dtoList: column) {
  if ("Key1".equalsIgnoreCase(column.getName())) {
    index = dtoList.indexOf(column);
  }
  }
for(List<String> listoflists: multiList) {
if(listoflists.contains(index)) {
for(String s: listoflists) {
dto.setKey1(s);
}
dtoList.add(dto);
}            
}

1 Ответ

0 голосов
/ 20 сентября 2018

См. https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html

Потоковые операции делятся на промежуточные и терминальные операции и объединяются в потоковые конвейеры.Потоковый конвейер состоит из источника (например, коллекции, массива, функции генератора или канала ввода-вывода);за ним следует ноль или более промежуточных операций, таких как Stream.filter или Stream.map;и терминальная операция, такая как Stream.forEach или Stream.reduce.

Итак, в приведенном выше фрагменте filter ничего не делает.Чтобы вызвать его, вы должны добавить операцию collect в конце.Обратите внимание, что лямбда-функция фильтра должна возвращать логическое значение, чтобы ваш код компилировался в первую очередь.

    mapData.entrySet().stream().filter(entry -> {
        // do something here

        return true;
    }).collect(Collectors.toList());

Конечно, вам не нужно злоупотреблять промежуточными операциями - или генерировать кучу новых объектов -для простых задач должно быть что-то вроде этого:

    mapData.entrySet().stream().forEach(entry -> {
        // do something
    });
...