You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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();
    }
}
分步解析

我们来逐一拆解流管道中的每个操作:

  1. 扁平化嵌套流:
    map.values().stream().flatMap(stream -> stream)
    将映射值中的Stream<Stream<String>>转换为包含所有嵌套流元素的单个Stream<String>。

  2. 过滤Null值:
    .filter(s -> s != null)
    排除所有null条目,避免后续调用字符串方法时抛出NullPointerException。

  3. 去除首尾空格:
    .map(String::trim)
    移除字符串首尾的空白字符,比如示例中的" D "会变成"D"。

  4. 过滤空字符串:
    .filter(s -> !s.isEmpty())
    丢弃那些修剪后变为空的字符串(比如原本就是纯空格的字符串)。

  5. 转换为首字母大写格式:
    .map(this::toTitleCase)
    辅助方法将字符串的首字母转为大写,其余字母转为小写。例如:

    • "kas" → "Kas"
    • "dddd" → "Dddd"
    • "c " 修剪后变为"c",再转为"C"
  6. 去重:
    .distinct()
    使用字符串的equals()方法去除重复条目。

  7. 排序:
    .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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:44:59