Java 将值映射到逗号分隔的字符串

问题描述 投票:0回答:8

有没有一种有效的方法可以使用 guava 或 StringUtils 将 java 映射值转换为逗号分隔的字符串?

Map<String, String> testMap = new HashMap<>();
testMap.put("key1", "val1");
testMap.put("key2", "val2");

寻找一种将 testMap 转换为字符串的方法 ->“val1,val2”。

java csv dictionary guava string-utils
8个回答
32
投票

以下是在 Java 8+ 中执行此操作的方法(不需要 Guava、StringUtils 或其他外部库):

testMap.values().stream().map(Object::toString).collect(Collectors.joining(","));

12
投票

番石榴:

Joiner.on(',').join(map.values())
.


9
投票

在 Java 1.8 中,String 类中添加了一个 join() 方法可以执行此操作。

此外

Map
有一个函数
values()
来获取所有值。 map.values() 是字符串类型,因此只需传递给 String.join 即可。示例:

Map<String, String> testMap = new HashMap<>();
testMap.put("key1", "val1");
testMap.put("key2", "val2");

String valueString = String.join(",",map.values()); //val1,val2

5
投票

您可以使用

StringUtils

final Map<String, String> testMap = new LinkedHashMap<String, String>();
testMap.put("key1", "val1");
testMap.put("key2", "val2");

String csv = StringUtils.join(testMap.values(), ',')); // "val1,val2"

注意,我将

HashMap
更改为
LinkedHashMap
,以保持插入顺序。


2
投票

好的,这是我的猜测,以防您想要这样的东西(您的问题中没有澄清)。这是在没有 Guava 或 StringUtils 的情况下完成的:

Map<Integer, Integer> map = new HashMap<Integer, Integer>();

map.put(1, 2);
map.put(3, 4);

System.out.println(map.toString());

输出:

{1=2, 3=4}

如果您想将

values
显示为逗号分隔列表,您可以使用以下命令:

System.out.println(map.values().toString());

输出:

[2, 4]

PS:如果需要,请用

[]
删除
.replaceAll()


1
投票

您可以在

Eclipse Collections
中使用 makeString()

MutableMap<String, String> testMap = new UnifiedMap<String, String>();
testMap.put("key1", "val1");
testMap.put("key2", "val2");

String commaAndSpace = testMap.makeString();
Assert.assertTrue(commaAndSpace.equals("val1, val2")
  || commaAndSpace.equals("val2, val1"));

String comma = testMap.makeString(",");
Assert.assertTrue(comma.equals("val1,val2")
  || comma.equals("val2,val1"));

如果您无法将

Map
转换为 Eclipse Collections 类型,您可以使用
MapAdapter

MapAdapter.adapt(testMap).makeString();

注意: 我是 Eclipse 集合的提交者。


0
投票

如果您正在使用 Spring MVC 那么这可能适合您。

import org.springframework.util.StringUtils;

Map<String, String> groups = //List of Maps
List<String> targetList = new ArrayList<String>(groups).values());
String csv = StringUtils.arrayToCommaDelimitedString(targetList.toArray());

输出:abc,def,ghi


0
投票

我认为排序在这里可能很重要。不确定 map.values() 是否按确定顺序返回,所以我更喜欢这个:

Map<String, Object> map = new HashMap<>();
map.put("key1","val1");
map.put("key2","val2");

String formatted = map.keySet().stream().sorted()
                .map(k -> map.getOrDefault(k, "").toString())
                .collect(Collectors.joining(","));

至少这样按键排序并且更安全一点?

© www.soinside.com 2019 - 2024. All rights reserved.