【问题标题】:Using lambda to format Map into String使用 lambda 将 Map 格式化为 String
【发布时间】:2015-07-26 02:00:51
【问题描述】:

我有一张带有Integer 键和值的地图。我需要将其转换为具有以下特定格式的Stringkey1 - val1, key2 - val2, key3 - val3。现在,我使用forEach 来格式化每个元素,将它们收集到一个列表中,然后执行 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);

有没有更短的方法呢?最好用 lambda 来做,因为我需要一些使用 lambda 的练习。

【问题讨论】:

    标签: java dictionary lambda java-8


    【解决方案1】:

    我认为您正在寻找这样的东西:

    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);
        }
    }
    

    依次遍历位:

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

    请注意,此处的顺序保证,因为HashMap 未排序。您可能希望使用TreeMap 来按键顺序获取值。

    【讨论】:

    • sorted(comparing(Entry::getKey)
    • 就是这样,谢谢!我不知道,如何将免费的 lambda 转换应用于地图,我发现的唯一方法 - Map.replaceAll,应该返回类型为原始类型的值。
    • @TEXHIK:关键是你不想改变 map - 你想得到一个投影的条目序列。
    • @JonSkeet:抱歉,我的评论表述不正确。我不知道,如何获得新的收藏,我想从 lambda 的地图中得到什么,我只知道,如何用它改变当前的地图。
    猜你喜欢
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多