String::toUpperCase是实例方法引用,等价于s->s.toUpperCase(),要求流中元素为非null的String类型,否则抛NullPointerException或ClassCastException。

Java 中方法引用可以简洁地替代 Lambda 表达式,在 Stream 的 map 操作中用 String::toUpperCase 转大写非常自然,前提是流中的元素确实是 String 类型。
前提:确保流中元素是 String 类型
方法引用 String::toUpperCase 是实例方法引用,它等价于 s -> s.toUpperCase(),要求调用对象非 null 且类型为 String。如果流中混入 null 或其他类型(如 Integer),运行时会抛出 NullPointerException 或 ClassCastException。
- ✅ 正确示例(List<String>):
List<String> words = Arrays.asList("hello", "world", "java");
List<String> upperWords = words.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
// 结果:["HELLO", "WORLD", "JAVA"]
处理 null 值:避免空指针异常
若原始数据可能含 null,直接用 String::toUpperCase 会崩。此时不能靠方法引用兜底,需改用 Lambda 显式判空。
- ❌ 错误(触发 NullPointerException):
Arrays.asList("hello", null, "world").stream()
.map(String::toUpperCase) // null.toUpperCase() → NPE
.collect(Collectors.toList());
- ✅ 替代方案(用 Lambda 安全处理):
.map(s -> s == null ? null : s.toUpperCase())
区分静态 vs 实例方法引用
String::toUpperCase 是**实例方法引用**(对象::方法),不是静态方法。别和 Objects::toString 这类静态引用混淆。它隐含“对每个 String 实例调用它的 toUpperCase() 方法”。
立即学习“Java免费学习笔记(深入)”;
- ⚠️ 注意:没有
String::toUppercase(拼写错误)或String.toUpperCase(缺少双冒号,编译不通过) - ✅ 正确写法只有:
String::toUpperCase
扩展:配合其他操作链式使用
方法引用可无缝嵌入 Stream 链,比如先过滤再转大写,或转大写后去重:
words.stream()
.filter(Objects::nonNull) // 先剔除 null
.map(String::toUpperCase) // 再转大写
.distinct() // 去重
.sorted() // 排序
.collect(Collectors.toList());


















