如何使用Stream API处理值为Stream<String>的Map生成目标字符串流?
解决方案代码
import java.util.Map; import java.util.stream.Stream; public class StreamProcessor { public Stream<String> listN(Map<String, Stream<String>> map) { return map.values().stream() .flatMap(stream -> stream) // 将所有嵌套流扁平化为单个流 .filter(s -> s != null) // 过滤掉null值 .map(String::trim) // 去除字符串首尾空格 .filter(s -> !s.isEmpty()) // 过滤掉修剪后为空的字符串 .map(this::toTitleCase) // 转换为首字母大写格式 .distinct() // 去重 .sorted(); // 按字典序排序 } private String toTitleCase(String s) { if (s.isEmpty()) { return s; } return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase(); } }
分步解析
我们来逐一拆解流管道中的每个操作:
扁平化嵌套流:
map.values().stream().flatMap(stream -> stream)
将映射值中的Stream<Stream<String>>转换为包含所有嵌套流元素的单个Stream<String>。过滤Null值:
.filter(s -> s != null)
排除所有null条目,避免后续调用字符串方法时抛出NullPointerException。去除首尾空格:
.map(String::trim)
移除字符串首尾的空白字符,比如示例中的" D "会变成"D"。过滤空字符串:
.filter(s -> !s.isEmpty())
丢弃那些修剪后变为空的字符串(比如原本就是纯空格的字符串)。转换为首字母大写格式:
.map(this::toTitleCase)
辅助方法将字符串的首字母转为大写,其余字母转为小写。例如:"kas"→"Kas""dddd"→"Dddd""c "修剪后变为"c",再转为"C"
去重:
.distinct()
使用字符串的equals()方法去除重复条目。排序:
.sorted()
按字典序对最终流进行排序,与你示例中的输出顺序一致。
示例验证
使用你提供的输入测试:
Map<String, Stream<String>> input = Map.of( "A", Stream.of("B", "C", " D "), "B", Stream.of("kas", "B", "c ", "dddd") ); new StreamProcessor().listN(input).forEach(System.out::println);
输出结果:
B C D Dddd Kas
完全符合预期。
内容的提问来源于stack exchange,提问作者pure21_h
相关产品推荐
相关产品推荐

