前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【后端】告别繁琐排序!Java Stream API 一站式解决方案

【后端】告别繁琐排序!Java Stream API 一站式解决方案

作者头像
框架师
发布2025-02-28 10:07:14
发布2025-02-28 10:07:14
13100
代码可运行
举报
文章被收录于专栏:墨白的Java基地墨白的Java基地
运行总次数:0
代码可运行

随着 Java 的持续迭代,Stream API 的排序能力越发成熟。本文将带你用 Stream 流操作征服各种数据结构的排序需求,包含数组、集合、Map、字符串和自定义对象,解锁函数式编程的优雅姿势。

一、数组排序(基本类型 vs 对象类型)

1.1 整型数组排序

代码语言:javascript
代码运行次数:0
复制
int[] numbers = {5, 2, 8, 1, 9};

// 自然排序(升序)
int[] ascOrder = Arrays.stream(numbers)
                      .sorted()
                      .toArray(); // [1, 2, 5, 8, 9]

// 倒序需要装箱处理
int[] descOrder = Arrays.stream(numbers)
                       .boxed()
                       .sorted(Comparator.reverseOrder())
                       .mapToInt(Integer::intValue)
                       .toArray(); // [9, 8, 5, 2, 1]

1.2 字符串数组排序

代码语言:javascript
代码运行次数:0
复制
String[] languages = {"Java", "Python", "C++", "Kotlin"};

// 按字母顺序
String[] alphabetical = Arrays.stream(languages)
                             .sorted()
                             .toArray(String[]::new); 

// 按字符串长度排序
String[] byLength = Arrays.stream(languages)
                         .sorted(Comparator.comparingInt(String::length))
                         .toArray(String[]::new);

二、集合排序(List/Set)

2.1 List 自然排序

代码语言:javascript
代码运行次数:0
复制
List<Integer> nums = new ArrayList<>(List.of(3, 1, 4, 1, 5));

List<Integer> sortedList = nums.stream()
                              .sorted()
                              .collect(Collectors.toList());

2.2 自定义对象排序

代码语言:javascript
代码运行次数:0
复制
record Product(String name, double price) {}

List<Product> products = List.of(
    new Product("Mouse", 25.99),
    new Product("Keyboard", 45.50)
);

// 按价格排序
List<Product> byPrice = products.stream()
                               .sorted(Comparator.comparing(Product::price))
                               .toList();

// 多条件排序(价格降序,名称升序)
List<Product> complexSort = products.stream()
                                   .sorted(Comparator
                                       .comparing(Product::price).reversed()
                                       .thenComparing(Product::name))
                                   .toList();

三、Map 排序黑科技

3.1 按键排序

代码语言:javascript
代码运行次数:0
复制
Map<String, Integer> scores = Map.of(
    "Bob", 88,
    "Alice", 95,
    "Charlie", 82
);

Map<String, Integer> sortedByKey = scores.entrySet().stream()
        .sorted(Map.Entry.comparingByKey())
        .collect(Collectors.toMap(
            Map.Entry::getKey,
            Map.Entry::getValue,
            (oldVal, newVal) -> oldVal,
            LinkedHashMap::new));

3.2 按值排序(倒序)

代码语言:javascript
代码运行次数:0
复制
Map<String, Integer> sortedByValue = scores.entrySet().stream()
        .sorted(Map.Entry.<String, Integer>comparingByValue().reversed())
        .collect(Collectors.toMap(
            Map.Entry::getKey,
            Map.Entry::getValue,
            (v1, v2) -> v1,
            LinkedHashMap::new));

四、字符串字符排序

4.1 字符拆分排序

代码语言:javascript
代码运行次数:0
复制
String text = "java21";

// 按 ASCII 排序
String asciiSorted = text.chars()
                        .sorted()
                        .collect(StringBuilder::new,
                               StringBuilder::appendCodePoint,
                               StringBuilder::append)
                        .toString(); // "12aajv"

// 字母忽略大小写排序
String caseInsensitive = Arrays.stream(text.split(""))
                             .sorted(String.CASE_INSENSITIVE_ORDER)
                             .collect(Collectors.joining());

五、并行流排序技巧

代码语言:javascript
代码运行次数:0
复制
List<Integer> bigData = // 百万级数据...

// 并行排序(注意线程安全)
List<Integer> parallelSorted = bigData.parallelStream()
                                     .sorted()
                                     .toList();

🚨 注意事项

  1. 使用 parallelStream() 前评估数据量
  2. 对象需要实现 Comparable 接口
  3. 排序后收集到 LinkedHashMap 保持顺序
  4. 注意装箱 / 拆箱的性能消耗

六、性能优化建议

  1. 预排序过滤:先 filter 再 sorted 减少处理量
  2. 避免重复排序:缓存排序结果多次使用
  3. 选择合适的比较器:方法引用比 lambda 效率更高
  4. 警惕空值:使用 Comparator.nullsFirst/nullsLast

📚 延伸思考 : 当排序遇到大数据量时,可以考虑:

  • 使用数据库索引预排序
  • 采用分治策略(MapReduce 思想)
  • 对无法装入内存的数据使用外部排序

掌握这些 Stream 排序技巧后,你会发现处理各种排序需求就像搭积木一样简单有趣!🎯

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、数组排序(基本类型 vs 对象类型)
    • 1.1 整型数组排序
    • 1.2 字符串数组排序
  • 二、集合排序(List/Set)
    • 2.1 List 自然排序
    • 2.2 自定义对象排序
  • 三、Map 排序黑科技
    • 3.1 按键排序
    • 3.2 按值排序(倒序)
  • 四、字符串字符排序
    • 4.1 字符拆分排序
  • 五、并行流排序技巧
  • 六、性能优化建议
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档