Получить все значения одного ключа из списка карты java8 - PullRequest
0 голосов
/ 24 мая 2018

У меня есть следующий список:

List<Map<String,Object>> mapList=new ArrayList<>();
Map<String,Object> mapObject=new HashMap<String,Object>();
mapObject.put("No",1);
mapObject.put("Name","test");
mapList.add(mapObject);
Map<String,Object> mapObject1=new HashMap<String,Object>();
mapObject1.put("No",2);
mapObject1.put("Name","test");
mapList.add(mapObject1);

and so on...

Теперь я хочу получить все значения ключа «Нет» в виде строки, разделенной запятой, следующим образом:

String noList="1,2,3"

Может кто-нибудь, пожалуйста, предложите мне, что может быть лучшим способом сделать это.Я знаю, что мы можем сделать это с помощью цикла, но вместо цикла есть другие способы сделать это.

Ответы [ 5 ]

0 голосов
/ 24 мая 2018

Вы можете выполнить цикл следующим образом:

List<String> noList = new ArrayList<>(mapList.size());
for (Map<String,Object> m : mapList) {
    Optional.ofNullable(m.get("No")) // get value mapped to "No" or empty Optional
        .map(Object::toString)
        .ifPresent(noList::add); // if not empty, add to list
}
System.out.println(String.join(",", noList));

или внутренне (официально предпочтительная версия IIRC):

List<String> noList = new ArrayList<>(mapList.size());
mapList.forEach(m -> 
    Optional.ofNullable(m.get("No")).map(Object::toString).ifPresent(noList::add));
System.out.println(String.join(",", noList));

Теперь, когда я думаю об этом, он короче Stream версия.

0 голосов
/ 24 мая 2018

Попробуйте,

String concatValues = mapList.stream().map(map -> String.valueOf(map.get("No")))
        .collect(Collectors.joining(","));
0 голосов
/ 24 мая 2018

Ответил на довольно похожий вопрос 30 минут назад.

Вы используете повторяющиеся клавиши.Это создает впечатление, что вам нужны не карты, а класс с атрибутами «Нет», «Имя» и т. Д. Если у вас есть этот класс, вы можете просто перебирать свои экземпляры в списке и объединять их в строку.

Если не имеет значения, какие карты вы хотите иметь, просто получите значения ключа «Нет», но учтите, что это неправильная практика, и вам, вероятно, следует использовать класс вместо карт:

String res = "";

for(int i = 0; i < mapList.size(); i++) {
    Map<String,Object> map = mapList.get(i);
    res.concat(map.get("No"));
    if(i != mapList.size() - 1)
        res.concat(",");
}

PS: Если вы идете с плохой практикой решения, используйте альтернативы потока в других ответах, если ваши знания потока достаточно, чтобы понять их.

0 голосов
/ 24 мая 2018

Пояснения в строке!

mapList.stream()                       // stream over the list
    .map(m -> m.get("No"))             // try to get the key "No"
    .filter(Objects::nonNull)          // filter any null values in case it wasn't present
    .map(Object::toString)             // call toString for each object
    .collect(Collectors.joining(",")); // join the values
0 голосов
/ 24 мая 2018

Просто отобразите список:

String list = mapList.stream()
    .filter(x -> x.containsKey("No")) // get only the maps that has the key
    .map(x -> x.get("No").toString()) // every map will be transformed like this
   .collect(Collectors.joining(",")); // joins all the elements with ","
System.out.println(list);

Использование HashMap<String, Object> предполагает, что, возможно, было бы лучше создать новый класс для этих данных.Вы рассматривали эту возможность раньше?

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