一、创建Stream流
- 从集合创建流
单列集合————Collection中的默认方法
List list = Arrays.asList("a", "b", "c");
Stream stream = list.stream();
双列集合————无法直接使用stream流
Map map = new HashMap<>();
map.put("Alice", 25);
map.put("Bob", 30);
map.put("Charlie", 28);
// 获取键的流
Stream keyStream = map.keySet().stream();
Stream> entryStream = map.entrySet().stream();
// 获取键值对的流
Stream> entryStream = map.entrySet().stream();
- 从数组创建流————Arrays工具类的静态方法
String[] array = {"a", "b", "c"};
Stream stream = Arrays.stream(array);
- 零散数据————Stream接口中的静态方法
Stream stream = Stream.of("a", "b", "c");
Stream integerStream = Stream.of(1, 2, 3);
二、Stream流的中间方法
- 过滤————filter
作用:过滤符合条件的元素。
List numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream()
.filter(n -> n % 2 == 0) // 只保留偶数
.forEach(System.out::println); // 输出:2, 4
- 截取(Limiting & Skipping)
limit(n)
作用:只取前n个元素。
List numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream()
.limit(3) // 只取前3个
.forEach(System.out::println); // 输出:1, 2, 3
skip(n)
作用:跳过前 n 个元素。
List numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream()
.skip(2) // 跳过前2个
.forEach(System.out::println); // 输出:3, 4, 5
- 去重————distinct()
作用:去除重复元素(基于 equals() 和 hashCode())。
List numbers = Arrays.asList(1, 2, 2, 3, 3, 3);
numbers.stream()
.distinct() // 去重
.forEach(System.out::println); // 输出:1, 2, 3
- 转换流中的数据类型————map()
List names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream()
.map(name -> name.toUpperCase())
.forEach(s -> System.out.println(s));
三、Stream流的终结方法
- 遍历————forEach
List.of("A", "B", "C").stream()
.forEach(System.out::println);
- 统计————count
作用:返回流中元素数量。
long count = List.of("A", "B", "C").stream()
.count();
- 收集结果————collect
作用:将流元素收集到容器(如 List、Set、Map)。
List peopleWithDuplicates = Arrays.asList(
new Person(1, "Alice"),
new Person(1, "Bob") // 重复的 id=1
);
// 因为map的key不能重复,所以有合并策略:保留旧值
Map mergedMap = peopleWithDuplicates.stream()
.collect(Collectors.toMap(
Person::getId,
Person::getName,
(oldValue, newValue) -> oldValue // 冲突时保留旧值
));
// 结果:{1=Alice}