使用lambda将Map格式化为String

TEX*_*HIK 44 java lambda dictionary java-8

我有一张带有Integer键和值的地图.我需要将它转换为String具有这种特定格式的:key1 - val1, key2 - val2, key3 - val3.现在,我正在使用forEach格式化每个元素,将它们收集到List中,然后执行String.join();

List<String> ships = new ArrayList<>(4);
for (Map.Entry<Integer, Integer> entry : damagedMap.entrySet())
{
    ships.add(entry.getKey() + " - " + entry.getValue());
}
result = String.join(",", ships);
Run Code Online (Sandbox Code Playgroud)

有没有更短的方法呢?用lambda做这件事会很好,因为我需要一些使用lambdas的练习.

Jon*_*eet 84

我想你正在寻找这样的东西:

import java.util.*;
import java.util.stream.*;
public class Test {

    public static void main(String[] args) throws Exception {
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "foo");
        map.put(2, "bar");
        map.put(3, "baz");
        String result = map.entrySet()
            .stream()
            .map(entry -> entry.getKey() + " - " + entry.getValue())
            .collect(Collectors.joining(", "));
        System.out.println(result);
    }
}
Run Code Online (Sandbox Code Playgroud)

依次经历这些事情:

  • entrySet() 获取可迭代的条目序列
  • stream() 为该可迭代创建一个流
  • map() 将该条目流转换为"键 - 值"形式的字符串流
  • collect(Collectors.joining(", "))使用", "作为分隔符将流中的所有条目连接成单个字符串.Collectors.joining返回一个Collector可以处理字符串输入序列的方法,给出单个字符串的结果.

请注意,此处保证订单,因为HashMap未订购.您可能希望使用TreeMap按键顺序获取值.

  • 或`sorted(比较(Entry :: getKey)` (5认同)