如何用Java 8 Stream将指定格式字符串转换为Map?
问题分析与解决方案
你的核心问题是没有正确识别输入字符串的结构:输入字符串是"Garagen/Stellplätze/Other 1/2/1",它的格式是「用/分隔的键列表」 + 「空格」 + 「用/分隔的值列表」,而不是多个「键/值」对用空格分隔。你的原代码错误地按空格拆分后,对每个子串再按/拆分,导致完全不符合预期的结果。
正确实现步骤
我们需要先把字符串拆成键集合和值集合两部分,再将它们一一对应绑定成Map:
- 按空格把原字符串拆分为键字符串和值字符串两部分(最多拆2份,避免值里有空格的情况);
- 分别把键字符串和值字符串用
/拆分成数组; - 遍历索引,将对应位置的键和值映射成Map。
完整代码示例
import java.util.Map; import java.util.stream.Collectors; import java.util.stream.IntStream; public class Main { public static void main(String[] args) { String responseString = "Garagen/Stellplätze/Other 1/2/1"; // 1. 拆分键部分和值部分 String[] keyValueSections = responseString.split("\\s+", 2); String[] keys = keyValueSections[0].split("/"); String[] values = keyValueSections[1].split("/"); // 可选:校验键值数量是否匹配 if (keys.length != values.length) { throw new IllegalArgumentException("键的数量与值的数量不匹配,请检查输入字符串"); } // 2. 用索引绑定键值对,生成Map Map<String, String> resultMap = IntStream.range(0, keys.length) .boxed() .collect(Collectors.toMap( index -> keys[index], index -> values[index] )); // 验证输出 resultMap.forEach((key, value) -> System.out.printf("%s -> %s%n", key, value)); } }
输出结果
Garagen -> 1 Stellplätze -> 2 Other -> 1
为什么原代码不对?
你的原代码用Pattern.compile("\\s* \\s*").splitAsStream(responseString.trim())按空格拆分后,得到两个元素:"Garagen/Stellplätze/Other"和"1/2/1"。然后对每个元素用split("/", 2)拆分,得到:
- 第一个元素拆成
["Garagen", "Stellplätze/Other"],对应Map条目Garagen -> Stellplätze/Other - 第二个元素拆成
["1", "2/1"],对应Map条目1 -> 2/1
这显然和你期望的键值对完全不符,因为完全误解了输入字符串的结构。
内容的提问来源于stack exchange,提问作者dian mushkov
相关产品推荐
相关产品推荐

