文章目录
Stream流的体验
什么是Stream流?
在Java 8中,得益于Lambda所带来的函数式编程, 引入了一个全新的Stream流概念。
目的:用于简化集合和数组操作的API。
例如下面的操作可以使用Stream流简化
创建一个集合,存储多个字符串元素
public static void main(String[] args) {
List<String> names = new ArrayList<>();
Collections.addAll(names, "张无忌", "周芷若", "赵敏", "张三丰", "张三");
}
把集合中所有以"张"开头的元素存储到一个新的集合
public static void main(String[] args) {
List<String> names = new ArrayList<>();
Collections.addAll(names, "张无忌", "周芷若", "赵敏", "张三丰", "张三");
List<String> newNames = new ArrayList<>();
for (String name : names) {
if (name.startsWith("张")) {
newNames.add(name);
}
}
System.out.println(newNames); // [张无忌, 张三丰, 张三]
}
把"张"开头的集合中的长度为3的元素存储到一个新的集合
public static void main(String[] args) {
List<String> names = new ArrayList<>();
Collections.addAll(names, "张无忌", "周芷若", "赵敏", "张三丰", "张三");
List<String> newNames = new ArrayList<>();
for (String name : names) {
if (name.startsWith("张")) {
newNames.add(name);
}
}
List<String> newNames2 = new ArrayList<>();
for (String newName : newNames) {
if (newName.length() == 3) {
newNames2.add(newName);
}
}
System.out.println(newNames2); // [张无忌, 张三丰]
}
Stream流的初体验, 简化上面代码:
- 使用Stream流可以链式调用
public static void main(String[] args) {
List<String> names = new ArrayList<>();
Collections.addAll(names, "张无忌", "周芷若", "赵敏", "张三丰", "张三");
names.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).forEach(s -> System.out.println(s));
}
- 两个filter条件可以合并
public static void main(String[] args) {
List<String> names = new ArrayList<>();
Collections.addAll(names, "张无忌", "周芷若", "赵敏", "张三丰", "张三");
names.stream().filter(s -> s.startsWith("张") && s.length() == 3).forEach(s -> System.out.println(s));
}
Stream流式思想的核心:
先得到集合或者数组的Stream流(就是类似一根传送带)
把元素放上去, 然后就用这个Stream流简化过的API来方便的操作元素
Stream流的获取
sream流的三类方法:
- 获取Stream流
创建一条流水线,并把数据放到流水线上准备进行操作
- 中间方法
流水线上的操作。一次操作完毕之后,还可以继续进行其他操作。
- 终结方法
一个Stream流只能有一个终结方法,是流水线上的最后一个操作
Stream操作集合或者数组的第一步是先得到Stream流,然后才能使用流的功能。
集合获取Stream流的方式:
- Collection集合获取Stream流的方式
可以使用Collection接口中的默认方法stream()生成流
名称 | 说明 |
---|---|
stream() | 获取当前集合对象的Stream流 |
public static void main(String[] args) {
// Collection集合获取Stream流的方式
Collection<String> list = new ArrayList<>();
Stream<String> s = list.stream();
}
- Map集合获取Stream流的方式
Map集合获取Stream流: 可以分别获取键的Stream流和值的Stream流, 也可以获取键值对流
public static void main(String[] args) {
// Map集合获取Stream流的方式
Map<String, Integer> maps = new HashMap<>();
// 键流
Stream<String> keyS = maps.keySet().stream();
// 值流
Stream<Integer> valueS = maps.values().stream();
// 键值对流
Stream<Map.Entry<String, Integer>> keyValue = maps.entrySet().stream();
}
- 数组获取Stream流的方式:
名称 | 说明 |
---|---|
stream(T[] array) | 获取当前数组的Stream流 |
of(T… values) | 获取当前数组/可变数据的Stream流 |
public static void main(String[] args) {
// 获取数组的Stream流
Integer[] arr = {
10, 20, 30};
// 方式一
Stream<Integer> arrS1 = Arrays.stream(arr);
// 方式二
Stream<Integer> arrS2 = Stream.of(arr);
}