## 什么是Stream流?
在Java 8中,得益于Lambda所带来的函数式编程, 引入了一个全新的Stream流概念。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
目的:`用于简化集合和数组操作的API`。
## Stream流思想
1. 先得到集合或者数组的Stream流(就是一根传送带)
2. 把元素放上去
3. 然后就用这个Stream流简化的API来方便的操作元素。
## Stream流初体验
```java
public class StreamDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("迪丽热巴");
list.add("古力娜扎");
list.add("ikun");
list.add("张无忌");
list.add("张三丰");
list.add("赵强");
list.add("lll");
//【普通方式操作集合/数组】
System.out.println("=============================【普通方式操作集合/数组】=============================");
//从集合中找出姓‘张’的放到新集合,zhangList
ArrayList<String> zhangList = new ArrayList<>();
for (String s : list) {
if (s.charAt(0) == '张') {
zhangList.add(s);
}
}
System.out.println(zhangList);
//2, 找出名称长度是3的姓名,放到新集合list3
ArrayList<String> list3 = new ArrayList<>();
for (String s : list) {
if (s.length() == 3) {
list3.add(s);
}
}
System.out.println(list3);
//【Stream操作集合/数组】
System.out.println("=============================【Stream操作集合/数组】=============================");
//list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length()==3); //s 表示集合或数组中的每一项元素,自定义名称;filter:过滤元素
list.stream().filter(s -> s.startsWith("张") && s.length() == 3).forEach(s -> System.out.println(s));
}
}
```
```tex
结果:
=============================【普通方式操作集合/数组】=============================
[张无忌, 张三丰]
[张无忌, 张三丰, lll]
=============================【Stream操作集合/数组】=============================
张无忌
张三丰
```
## 获取Stream流
创建一条流水线,并把数据放到流水线上准备进行操作【通过集合或数组生成Stream流对象】
| 数据类型 | 名称 | 说明 |
| -------- | --------------------------------------------- | ------------------------------- |
| 集合 | default Stream<E> stream() | 获取当前集合对象的Stream流 |
| 数组 | public static <T> Stream<T> stream(T[] array) | 获取当前数组的Stream流 |
| 数组 | public static<T> Stream<T> of(T... values) | 获取当前数组/可变数据的Stream流 |
```java
public static void main(String[] args) {
/*-------------------------------------Collection集合获取Stream流-----------------------------------------------*/
ArrayList<String> list = new ArrayList<>();
Stream<String> stream = list.stream();
/*-------------------------------------Map集合获取Stream流-----------------------------------------------*/
HashMap<Object, Object> maps = new HashMap<>();
//键流
Stream<Object> keyStream = maps.keySet().stream();
//值流
Stream<Object> valueStream = maps.values().stream();
//键值对流(拿整体)
Stream<Map.Entry<Object, Object>> keyAndValueStream = maps.entrySet().stream();
/*-------------------------------------数组获取Stream流-----------------------------------------------*/
String[] names = {"张三", "李四", "赵五", "王五"};
Stream<String> nameStream = Arrays.stream(names);
Stream<String> nameStream2 = Stream.of(names);
}
```