java8的stream流常用用法sorted

该文章已生成可运行项目,

持续更新~~,用法案例,项目开发中方便寻找

每到需要用的时候,翻半天才到案例,都统计在此,方便寻找

一. 排序 stream().sorted()

 public void setVarroleList(List<VarroleEntity> varroleList) {
        if (varroleList != null && varroleList.size() > 0) {
            varroleList = varroleList.stream().sorted(Comparator.comparing(VarroleEntity::getSeq)).collect(Collectors.toList());
        }


        this.varroleList = varroleList;
    }

1. 缺省排序字段: 以类属性一升序排序

list.stream().sorted(Comparator.comparing(::属性一));
// list里面是map的,List<Map<String, Integer>> 
list.stream().sorted(Comparator.comparingInt(map -> map.get("key")));

2. 带排序字段: 以类属性一升序排序,推荐Comparator.reverseOrder()

2.1.升序:不加参数即可
2.2.降序:reversed()和Comparator.reverseOrder(),有区别:

reversed():先排序(默认升序),然后降序;
Comparator.reverseOrder():直接降序排序;

2.3.案例:注意两种写法
//先以属性一升序,结果进行属性一降序
list.stream().sorted(Comparator.comparing(::属性一).reversed());
//以属性一降序
list.stream().sorted(Comparator.comparing(::属性一,Comparator.reverseOrder()));

3. 多属性排序,降序都以Comparator.reverseOrder()为例


//属性一升序,属性二降序
list.stream().sorted(Comparator.comparing(::属性一).thenComparing(::属性二,Comparator.reverseOrder()));


//属性一降序,属性二升序
list.stream().sorted(Comparator.comparing(::属性一,Comparator.reverseOrder()).thenComparing(::属性二));


本文章已经生成可运行项目
Java 8 中,`Stream` 是一个非常强大的函数式编程特性,它提供了一种**声明式的方式来处理集合数据**(如 `List`、`Set` 等),支持**过滤、映射、排序、聚合**等操作。Stream API 的设计灵感来自函数式编程语言,它使代码更简洁、可读性更强,并且可以方便地进行**链式操作**。 --- ## ✅ Stream 的核心特点 | 特性 | 说明 | |------|------| | **不是数据结构** | Stream 不存储数据,而是从集合、数组或 I/O 中获取数据 | | **不可重复使用** | 一个 Stream 只能被消费一次,不能复用 | | **支持链式调用** | 可以通过链式方法连续操作(如 filter → map → sorted → collect) | | **惰性求值(Lazy Evaluation)** | 中间操作不会立即执行,直到遇到终端操作 | | **支持并行操作** | 使用 `parallelStream()` 可以并行处理数据,提高性能 | --- ## ✅ Stream 的基本结构 一个典型的 Stream 操作包括: 1. **获取 Stream 源**(集合、数组、生成器等) 2. **中间操作(Intermediate operations)**:返回一个新的 Stream 3. **终端操作(Terminal operations)**:触发实际计算并返回结果(非 Stream) --- ## ✅ 获取 Stream 的方式 | 方式 | 示例 | |------|------| | 从集合获取 | `list.stream()` | | 从数组获取 | `Arrays.stream(array)` | | 使用 Stream.of | `Stream.of("a", "b", "c")` | | 使用 Stream.generate | `Stream.generate(Math::random).limit(5)` | | 使用 Stream.iterate | `Stream.iterate(1, n -> n + 1).limit(10)` | --- ## ✅ 常见中间操作(Intermediate Operations) | 方法 | 说明 | |------|------| | `filter(Predicate<T>)` | 过滤满足条件的元素 | | `map(Function<T, R>)` | 将元素映射为另一种形式 | | `flatMap(Function<T, Stream<R>>)` | 将每个元素映射为 Stream,然后合并所有 Stream | | `distinct()` | 去重 | | `sorted()` 或 `sorted(Comparator<T>)` | 排序 | | `limit(long n)` | 截取前 n 个元素 | | `skip(long n)` | 跳过前 n 个元素 | --- ## ✅ 常见终端操作(Terminal Operations) | 方法 | 说明 | |------|------| | `forEach(Consumer<T>)` | 对每个元素执行操作 | | `collect(Collector<T, A, R>)` | 收集结果到 List、Set、Map 等 | | `reduce(BinaryOperator<T>)` | 合并元素,返回一个可选值 | | `count()` | 返回元素数量 | | `anyMatch(Predicate<T>)` | 是否有任意一个元素满足条件 | | `allMatch(Predicate<T>)` | 是否所有元素都满足条件 | | `noneMatch(Predicate<T>)` | 是否没有元素满足条件 | | `findFirst()` | 返回第一个元素 | | `findAny()` | 返回任意一个元素(适用于并行) | --- ## ✅ Stream 的完整示例 ### 示例 1:过滤 + 映射 + 收集 ```java List<String> names = Arrays.asList("Alice", "Bob", "Anna", "Charlie", "Alex"); List<String> filteredNames = names.stream() .filter(name -> name.startsWith("A")) .map(String::toUpperCase) .sorted() .collect(Collectors.toList()); System.out.println(filteredNames); // 输出:[ALEX, ALICE, ANNA] ``` --- ### 示例 2:统计 + 聚合 ```java List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6); int sum = numbers.stream() .mapToInt(Integer::intValue) .sum(); System.out.println("Sum: " + sum); // 输出:Sum: 21 ``` --- ### 示例 3:FlatMap 合并多个 ```java List<List<String>> list = Arrays.asList( Arrays.asList("a", "b"), Arrays.asList("c", "d"), Arrays.asList("e") ); List<String> flatList = list.stream() .flatMap(List::stream) .collect(Collectors.toList()); System.out.println(flatList); // 输出:[a, b, c, d, e] ``` --- ### 示例 4:分组和分区 ```java Map<Integer, List<String>> grouped = names.stream() .collect(Collectors.groupingBy(String::length)); System.out.println(grouped); // 输出:{3=[Bob], 4=[Anna, Alex], 5=[Alice], 7=[Charlie]} ``` ```java Map<Boolean, List<String>> partitioned = names.stream() .collect(Collectors.partitioningBy(name -> name.startsWith("A"))); System.out.println(partitioned); // 输出:{false=[Bob, Charlie], true=[Alice, Anna, Alex]} ``` --- ## ✅ 并行(Parallel Stream) 使用 `parallelStream()` 可以启用并行处理,适用于大数据量时提升性能: ```java List<Integer> bigList = IntStream.rangeClosed(1, 1_000_000).boxed().collect(Collectors.toList()); int sum = bigList.parallelStream() .mapToInt(Integer::intValue) .sum(); System.out.println("Sum: " + sum); ``` --- ## ✅ Stream 的注意事项 | 注意事项 | 说明 | |----------|------| | ❌ 不要重复使用同一个 Stream | Stream 只能消费一次,否则抛出 `IllegalStateException` | | ❌ 不适合处理非常小的数据集 | 对小数据集使用 Stream 会带来额外的开销 | | ✅ 适合处理中大型数据集 | 尤其适合使用 `parallelStream()` 进行并行处理 | | ✅ 保持函数式风格 | 避免在中间操作中修改外部状态(保持无副作用) | | ✅ 优先使用 `Collectors` 工具类 | 提供了丰富的收集器(toList, toSet, groupingBy 等) | --- ## ✅ Stream 与集合操作对比 | 操作 | 普通集合写法 | Stream 写法 | |------|---------------|-------------| | 过滤 | for + if | `filter()` | | 映射 | for + add | `map()` | | 排序 | `Collections.sort()` | `sorted()` | | 分组 | 手动 Map 操作 | `groupingBy()` | | 统计 | 手动累加 | `mapToInt().sum()` | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值