如何在Java Stream的.map中实现首字母大写并对列表排序?
嘿,这问题其实很简单,你之前写的单个字符串首字母大写的逻辑完全可以直接搬到Stream的map操作里!我给你完整的解决方案,再拆解下细节:
完整实现代码
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class NameSortingExample { public static void main(String[] args) { List<String> topNames2017 = Arrays.asList( "Amelia", "Olivia", "emily", "Isla", "Ava", "oliver", "Jack", "Charlie", "harry", "Jacob" ); List<String> sortedCapitalizedNames = topNames2017.stream() // 把你之前的首字母大写逻辑放进lambda里 .map(name -> name.substring(0, 1).toUpperCase() + name.substring(1)) // 按自然字母顺序排序 .sorted() // 收集成最终的列表 .collect(Collectors.toList()); // 打印验证结果 sortedCapitalizedNames.forEach(System.out::println); } }
关键细节说明
map里的首字母大写逻辑:
Stream的map方法就是用来逐个转换元素的,你之前写的substring(0,1).toUpperCase() + substring(1)完全可以直接封装成lambda表达式传给map。这个逻辑会保留原字符串除首字母外的大小写,比如原字符串是"emily"会变成"Emily",原字符串是"Amelia"则保持不变。进阶:统一其余字母为小写:
如果希望不管原字符串其余字母的大小写,都统一转为小写(比如把"OLIVER"变成"Oliver"),可以修改map的逻辑:.map(name -> name.substring(0, 1).toUpperCase() + name.substring(1).toLowerCase())排序的小优化:
默认的sorted()是按字符串的自然顺序排序(大小写敏感,大写字母会排在小写前面),如果想要忽略大小写排序(比如让"ava"和"Ava"排在同一位置),可以改用:.sorted(String.CASE_INSENSITIVE_ORDER)代码复用:抽成单独方法:
如果这个首字母大写的逻辑需要在多处使用,建议抽成一个工具方法,用方法引用让代码更清晰:private static String capitalizeFirstLetter(String name) { // 加个空值判断更健壮 if (name == null || name.isEmpty()) { return name; } return name.substring(0, 1).toUpperCase() + name.substring(1); }然后在map里这样用:
.map(NameSortingExample::capitalizeFirstLetter)
内容的提问来源于stack exchange,提问作者Workkkkk
相关产品推荐
相关产品推荐

