2017-02-02 8 views
-1

Я пытаюсь получить список Long из списка карт, используя Stream API.Java 8 stream: parse list of maps

Это как класс выглядит следующим образом:

class Report Bean{ 
    private MarshallableMap data; 
} 

данных Объект содержит записи, как это: ("ID", 1), ("Name", "АСМАП").

Мне нужно получить список идентификаторов из списка ReportBeans. Это то, что я пробовал:

List<Long> ids = reportBeans.stream().flatMap(
        m -> m.getData().entrySet().stream() 
          .filter(e -> e.getKey().equals("ID")) 
          .map(Map.Entry::getValue) 
          .map(Long.class::cast)) 
          .collect(Collectors.toList()); 

Я получаю пустой список. Пожалуйста, мне нужен совет. Спасибо

+0

вы уверены, что есть какие-то бобы с ключом, который точно '«ID»'? – Moira

+0

Делитесь тем, что состоит из MarshallableMap. Как связан идентификатор. И, может быть, опечатка в классе name 'ReportBean' – nullpointer

ответ

3

Существует много ненужных потоков. Я думаю, что это больше подходит для ваших нужд:

reportBeans.stream() 
    .map(r -> r.getData().get("ID")) 
    .filter(Objects::nonNull) 
    .map(Long.class:cast) 
    .collect(toList()); 
0

Вы не показали, как выглядит ваш класс MarshallableMap. Нам необходимо дать точный ответ. Но если поле ваших «данные» имеет тип Map<String, String>, вы можете получить список идентификаторов следующим образом:

 List<Long> ids = reportBeans.stream() 
     .flatMap(
       m -> (m.getData().entrySet().stream() 
         .filter(e -> "ID".equals(e.getKey())) 
         .map(e -> Long.valueOf(e.getValue()))) 
     ) 
     .collect(Collectors.toList()); 
+1

Почему вы, люди, настаиваете на повторении над' entrySet'? –

+0

@ Михаил Прохоров, кто настаивает на этом? Мой ответ просто дает исправление в коде OP с минимальными изменениями. Всегда есть способы улучшить программу, которая здесь не соответствует теме. – VHS