麒麟V10SP1重装保留数据盘:分区、UUID与fstab全流程避坑指南
2026/10/24 17:20:03
distinct()与sorted()本节将讲解如何使用distinct()去除重复值,使用sorted()对流元素排序,包括:
distinct()—— 去重利器distinct()会移除流中重复的元素,依据是元素的:
hashCode()和equals()所以:你使用的对象必须正确实现这两个方法,才能保证去重有效。
distinct()的内部原理distinct()并不像大多数中间操作那样是“无状态”的:
Set集合来追踪已见过的元素。Set。⚠️ 因为要维护状态,所以它会占用内存,但能即时输出结果。
List<Integer>ints=List.of(1,4,2,1,3,3);List<Integer>distincts=ints.stream().distinct().toList();System.out.println("distinct ints: "+distincts);distinct ints:[1,4,2,3]✅ 说明:重复的1和3被移除了,且保持原始顺序。
sorted()—— 排序操作sorted()用于将流中的元素排序。
它有两个重载:
Stream<T>sorted();// 自然顺序(元素必须实现 Comparable)Stream<T>sorted(Comparator<?superT>c);// 自定义顺序sorted()是有状态的中间操作。List<String>strings=List.of("one","two","three","four");List<String>naturalSort=strings.stream().sorted().toList();System.out.println("natural sort: "+naturalSort);natural sort:[four,one,three,two]👉 字符串按照字典序排序。
List<String>shortestFirst=strings.stream().sorted(Comparator.comparingInt(String::length)).toList();System.out.println("shortest first: "+shortestFirst);shortest first:[one,two,four,three]👉 按字符串长度升序排序。
distinct()适用于无限流它可以边处理边输出,只要有足够的终止条件(如limit()),就不会卡死。
varints=IntStream.iterate(0,i->i+1).map(i->i/3).distinct().limit(5).toArray();System.out.println("ints = "+Arrays.toString(ints));ints=[0,1,2,3,4]🌟 它发现新值就会推送给下游,表现非常高效!
sorted()不适用于无限流因为它必须先收集所有元素再排序,所以当流无限时,它永远等不到结束,程序会卡死或耗尽内存。
int[]ints=IntStream.iterate(0,i->i+1).map(i->i/3).sorted().limit(5).toArray();System.out.println("ints = "+Arrays.toString(ints));<程序将无限等待,永远没有结果>| 方法 | 是否有状态 | 是否可用于无限流 | 内部机制 |
|---|---|---|---|
distinct() | 有状态 | ✅ 支持 | 使用Set去重 |
sorted() | 有状态 | ❌ 不支持 | 使用缓冲区收集+排序 |
你的类必须实现正确的:
equals()hashCode()示例:
recordUser(Stringname,intage){}List<User>users=...;users.stream().distinct().toList();// 正常去重如用的是Comparator排序:
users.stream().sorted(Comparator.comparing(User::age)).toList();