首页 > 解决方案 > 如何映射列表其中每个字符串都是逗号分隔的字符串到 List以逗号分隔加入?

问题描述

标签——["tag1", "tag2, tag3"]

预期输出——["tag1","tag2","tag3"]

当前代码:

List<String> tagsProcessed = new ArrayList<>();
for(String t : tags) {
    tagsProcessed.addAll(Stream.of(t.split(",")).map(String::trim).collect(Collectors.toList()));
}

如何用流重写它?

标签: javajava-stream

解决方案


许多解决方案之一:

var delimiter = Pattern.compile(",");
tags.stream()
    .flatMap(delimiter::splitAsStream)
    .map(String::trim)
    .forEach(tagsProcessed::add);

或者,避免(隐藏!)trim调用(但不删除输入字符串开头和结尾的空格):

var delimiter = Pattern.compile("\\s*,\\s*");
tags.stream()
    .flatMap(delimiter::splitAsStream)
    .forEach(tagsProcessed::add);

我更喜欢第一个,清楚地显示对trim


以上所有内容也可以更改为(直接)使用 的结果Collectors.toList(),但要注意返回的种类List。从文档:

不保证返回的 List 的类型、可变性、可序列化性或线程安全性;如果需要对返回的列表进行更多控制,请使用 toCollection(Supplier)。

使用它addAll不是问题(但类似于forEach上面代码中的使用);如果返回的列表没有被更改,也不是问题。


推荐阅读