Stream流
836字约3分钟
2025-10-03
Stream流
单列集合获取流
// 单列集合获取流
// 通过Collections获取
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "a", "b", "c");
Stream<String> s1 = list.stream();
// s1.forEach(new Consumer<String>() {
// @Override
// public void accept(String s) {
// System.out.println(s);
// }
// }); 简化得
list.stream().forEach(s -> System.out.println(s));
// 输出
a
b
c
双列集合获取流
// 双列集合获取流
// 通过keySet | values | entrySet方法转换成Set获取的
HashMap<String, Integer> map = new HashMap<>();
map.put("张三", 111);
map.put("李四", 222);
map.put("王五", 333);
// 获取键
map.keySet().stream().forEach(s -> System.out.println(s));
// 获取值
map.values().stream().forEach(s -> System.out.println(s));
// 获取键值
map.entrySet().stream().forEach(s -> System.out.println(s));
数组获取流
// 数组获取流
// 通过Arrays方法获取的
int[] num = {1, 2, 3, 4, 5};
Arrays.stream(num).forEach(s -> System.out.println(s));
零散数据获取流
// 零散数据获取流
// 不推荐使用功能Stream.of来获取 数组 的值
Stream.of(1, 2, 3, 4).forEach(s -> System.out.println(s));
Stream.of("a", "b", "c", "d").forEach(s -> System.out.println(s));
过滤
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "张三", "李四", "王五", "张忌");
// 过滤
list.stream()
// 第一个字符为 张 且 字符串长度为 2 的
.filter(s -> s.startsWith("张"))
.filter(s -> s.length() == 2)
// 打印出所有满足条件的值
.forEach(s -> System.out.println(s)); // 张三、张忌
取前几个值
// 取前几个值
list.stream()
.limit(3)
.forEach(s -> System.out.println(s));
跳过前几个元素
// 跳过前几个元素
list.stream()
.skip(2)
.forEach(s -> System.out.println(s));
去重
// 去重(依赖hashCode和equals)
ArrayList<String> list1 = new ArrayList<>();
Collections.addAll(list1, "张三", "张三", "张三", "李四", "王五", "张忌");
list1.stream().distinct().forEach(s -> System.out.print(s)); // 张三 李四 王五 张忌
合并流
// 合并流
Stream.concat(list.stream(), list1.stream()).forEach(s -> System.out.print(s));
// 输出:张三 李四 王五 张忌 张三 张三 张三 李四 王五 张忌
转换数据类(k-v)
ArrayList<String> list2 = new ArrayList<>();
Collections.addAll(list2, "张三-1", "李四-2", "王五-3");
// 转换数据类
list2.stream()
.map(new Function<String, Integer>() {
@Override
public Integer apply(String s) {
String[] arr = s.split("-");
String s1 = arr[1];
int age = Integer.parseInt(s1);
return age;
}
}).forEach(s -> System.out.println(s));
// 化简
list2.stream()
.map(s -> Integer.parseInt(s.split("-")[1]))
.forEach(s -> System.out.println(s)); // 1 2 3
遍历
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "a", "b", "c", "d");
// 遍历集合元素
list.stream().forEach(s -> System.out.println(s));
// a b c d
集合元素个数
// 集合元素个数
long num = list.stream().count();
System.out.println(num); // 4
将集合中的元素放到数组中
// 将集合中的元素放到数组中
Object[] o = list.stream().toArray();
System.out.println(Arrays.toString(o)); // [a, b, c, d]
// 将集合中的元素放到指定元素的的数组
// list.stream().toArray(new IntFunction<String[]>() {
// @Override
// public String[] apply(int value) {
// return new String[value];
// }
// }); 化简得如下代码
// 将集合中的元素放到String数组中
String[] s1 = list.stream().toArray(s -> new String[s]);
System.out.println(Arrays.toString(s1));
流元素放到集合中
List
ArrayList<String> aray = new ArrayList<>();
Collections.addAll(aray,
"张三-男-18", "张六-男-18", "李四-男-25", "翠花-女-20", "赵六-男-23");
// 将流中的元素放到List集合中
List<String> list = aray.stream()
.filter(s -> "男".equals(s.split("-")[1]))
.collect(Collectors.toList());
System.out.println(list);
Set
// 将流中的元素放到Set集合中
Set<String> set = aray.stream()
.filter(s -> "女".equals(s.split("-")[1]))
.collect(Collectors.toSet());
System.out.println(set);
Map
// 将流中的元素放到Map集合中
Map<String, Integer> map = aray.stream()
.filter(s -> "男".equals(s.split("-")[1]))
// 张三-男-18 将第一个作为键,第三个作为值
// 定义Map 键值规则
.collect(Collectors.toMap(
// 键
s -> s.split("-")[0],
// 值
s -> Integer.parseInt(s.split("-")[2])
));
System.out.println(map);