Using lambda to format Map into String

2019-03-09 15:50发布

I have a map with Integer keys and values. I need to transform it into a String with this specific format: key1 - val1, key2 - val2, key3 - val3. Now, I'm using forEach to format each element, collect them into a List, and then do 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);

Is there any shorter way to do it? And it would be good to do it with lambda, because I need some practice using lambdas.

1条回答
男人必须洒脱
2楼-- · 2019-03-09 16:45

I think you're looking for something like this:

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

To go through the bits in turn:

  • entrySet() gets an iterable sequence of entries
  • stream() creates a stream for that iterable
  • map() converts that stream of entries into a stream of strings of the form "key - value"
  • collect(Collectors.joining(", ")) joins all the entries in the stream into a single string, using ", " as the separator. Collectors.joining is a method which returns a Collector which can work on an input sequence of strings, giving a result of a single string.

Note that the order is not guaranteed here, because HashMap isn't ordered. You might want to use TreeMap to get the values in key order.

查看更多
登录 后发表回答