2016-07-01 2 views
4

Я хочу связать ключ и значение HashMap с строкой с помощью:: и преобразовать их в список.Подключить ключ и значение HashMap к списку

Пример:

Map<String,String> tags = new HashMap<>(); 
tags.put("k1","v1"); 
tags.put("k2","v2"); 

то я хочу, чтобы получить строку

k1: v1, k2: v2

мой код:

private String transe(Map<String, String> tags) { 
    if (tags == null || tags.isEmpty()) { 
     return DEFAULT_STATUS_GROUP; 
    } 
    List<String> tagKVList = new ArrayList<>(); 
    tags.forEach((key, value) -> tagKVList.add(String.join(":", key, value))); 
    tagKVList.sort((tag1, tag2) -> tag1.compareTo(tag2)); 
    return tagKVList.stream().collect(Collectors.joining(",")); 
} 

Как я могу удалить lo cal переменная tagKVList и сделать код clearer?

+1

лямбда-выражения приятная особенность, до сих пор вам не нужно их указывать лишние вещи. 'String' '' Comparable', поэтому у них есть метод compareTo, поэтому вам не нужно указывать 'compator' (tag1, tag2) -> tag1.compareTo (tag2). Вы можете просто использовать «tagKVList.sort (null)» или, если вам нравится безопасность типа, «tagKVList.sort (Comparator.naturalOrder())». – Holger

ответ

5

Вам не нужен промежуточный List. Вы можете StreamentrySet, map каждую запись к String и collect к одному String, как вы уже делаете:

return tags.entrySet().stream() 
         .map(e-> String.join(":", e.getKey(), e.getValue())) 
         .sorted() 
         .collect(Collectors.joining(",")); 
+3

Хороший старый 'e.getKey() +": "+ e.getValue()' будет делать также вместо 'String.join (": ", e.getKey(), e.getValue())' ... О, и вы забыли «отсортированный()» шаг. – Holger

+1

@Holger Спасибо, я пропустил этот шаг. – Eran

Смежные вопросы