黑马开源 Java 基础教程笔记,如有侵权内容请联系本人删除,感谢。
Stream 流的思想
- 可以理解为工厂的流水线
- 结合 lambda 表达式,简化集合、数组操作
- 使用步骤为:
- 得到 stream 流
- 利用 stream 流中各类 api 操作
- 中间方法
- 终结方法
获取 stream 流
public void testStream(){
// 单列集合
List<String> a = new ArrayList<>();
a.add("a");
a.add("b");
a.add("c");
a.add("d");
a.add("e");
Collections.addAll(a, "hh", "bb");
// 获取流水线
Stream<String> single_column_stream = a.stream();
// 使用终结方法打印流水线上数据
single_column_stream.forEach(s -> System.out.println(s));
// 双列集合
Map<String, String> map = new HashMap<>();
map.put("a", "b");
map.put("c", "d");
map.put("d", "e");
map.keySet().stream().forEach(s -> System.out.println(map.get(s)));
map.entrySet().stream().forEach(e -> System.out.println(e));
// 数组类型
int[] arr = {1, 2, 3, 4, 5};
Arrays.stream(arr).forEach(s -> System.out.print(s + " "));
// 零散数据
Stream.of(1,2,3,4,5).forEach(s -> System.out.print(s + " "));
}
注意:Stream.of() 的形参不能是基本数据类型数组
// 注意
// 下面输出:[I@5b2133b1
Stream.of(arr).forEach(s -> System.out.print(s + " "));
Stream 的中间方法
filter
List<String> names = new ArrayList<>();
Collections.addAll(names, "张无忌", "张良", "孙悟空", "张飞");
// 过滤,留下 张 开头数据
names.stream().filter(s -> {
// 返回 true 流
if (s.startsWith("张")) {
return true;
}
return false;
}).forEach(s -> System.out.println(s));
注意:原来的 stream 流只能使用一次,链式编程 —— 一行解决 (代码可读性变差 —— 多换行解决)
List<String> names = new ArrayList<>();
Collections.addAll(names, "张无忌", "张良", "孙悟空", "张飞");
// 过滤,留下 张 开头数据
names.stream().filter(s -> {
// 返回 true 流
if (s.startsWith("张")) {
return true;
}
return false;
}).filter(s -> {
if (s.length() == 2) {
return true;
}
return false;
}).forEach(s -> System.out.println(s));
limit 限制
names.stream().limit(2).forEach(s -> System.out.println(s));
skip 跳过
names.stream().skip(2).forEach(s -> System.out.println(s));
distinct 去重
依赖 hashcode 和 equals 方法
names.stream().distinct().forEach(s -> System.out.println(s));
concat 合并
Stream.concat(names2.stream(), names.stream()).forEach(s -> System.out.println(s));
map 类型转换
ages.stream().map(s -> Integer.parseInt(s)).forEach(s -> System.out.println(s));
终结方法
没有返回值,流的最后操作
forEach
ages.stream().map(s -> Integer.parseInt(s)).forEach(s -> System.out.println(s));
count
统计流中数据
long count = ages.stream().map(s -> Integer.parseInt(s)).count();
toArray
收集流中数据到数组
Integer[] agesArray = ages.stream()
.map(s -> Integer.parseInt(s))
.toArray(value -> new Integer[value]);
收集方法 collect
// 收集到 list 集合
List<String> new_list = ages.stream().filter(s -> Integer.parseInt(s) >= 20).collect(Collectors.toList());
// 收集到 set 集合
Set<String> new_set = ages.stream().filter(s -> Integer.parseInt(s) >= 20).collect(Collectors.toSet());
// 收集到 map 集合
List<String> persons = new ArrayList<>();
Collections.addAll(persons, "张无忌-18", "张良-32", "孙悟空-100001", "张飞-28");
// map 集合有两个参数
// new Function<String, String>()
// 第一个为 流的数据类型
// 第二个为 map中键/值的数据类型
// **注意:键不能重复,代码会报错
Map<String, Integer> collect = persons
.stream()
.filter(s -> Integer.parseInt(s.split("-")[1]) >= 20)
.collect(Collectors.toMap(s -> s.split("-")[0], s -> Integer.parseInt(s.split("-")[1]))
);