Stream流
Stream流是简化集合、数组操作的API。并且结合了Lambda表达式

java
package com.itheima.demo1hashset.demo3stream;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class StreamDemo1 {
public static void main(String[] args) {
//目标:认识Stream流,掌握其基本使用步骤,体会它的优势和特点
List<String> list = new ArrayList<>();
list.add("张楚岚");
list.add("荒天帝");
list.add("叶天帝");
list.add("罗峰");
list.add("唐三");
list.add("李星云");
//1、先用传统方案找出姓张的人,名字为三个字的,存入到一个新集合中去
List<String> newlist = new ArrayList<>();
for (String name : list) {
if(name.startsWith("张") && name.length() == 3){
newlist.add(name);
}
}
//2、使用Stream流
List<String> newlist2 = list.stream().filter(name -> name.startsWith("张")).filter(name -> name.length() == 3).collect(Collectors.toList());
System.out.println(newlist2);
}
}
Stream的使用步骤

1、获取Stream流
1、Stream流本质上是一个接口,可以通过直接调以下方法可以得到一个数组,不需要单独new;
2、所有单列集合拿Stream流都是调Stream方法;
3、Map集合要通过map.keySet().stream()和map.values().stream()分别获得键和值的Stream流或用map.entrySet()把Map类型打成Set类型
4、方法中的T通配任意类型,其中最后一个可以接一个参数、多个参数或者一个数组

java
package com.itheima.demo1hashset.demo3stream;
import java.util.*;
import java.util.stream.Stream;
public class StreamDemo2 {
public static void main(String[] args) {
//目标:获取Stream流的方式
//1、获取集合的Stream流,调用集合提供的Stream()方法
Collection<String> list = new ArrayList<>();
Stream<String> s1 = list.stream();
//2、Map集合获取Stream流
Map<String, Integer> map = new HashMap<>();
//获取键值Stream流
Stream<String> s2 = map.keySet().stream();
//获取值的Stream流
Stream<Integer> s3 = map.values().stream();
//获取键值对Stream流
Stream<Map.Entry<String, Integer>> s4 = map.entrySet().stream();
//3、数组获取Stream流
String[] arr = {"张三", "张三丰", "张翠山", "张无忌"};
Stream<String> s5 = Arrays.stream(arr);
Stream<String> s6 = Stream.of("张三", "张三丰", "张翠山", "张无忌");//效果一样
}
}
2、调用流水线的各种方法(中间方法)
中间方法指的是调用完成后会返回新的Stream流,可以继续使用,即支持链式编程

java
package com.itheima.demo1hashset.demo3stream;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Stream;
public class StreamDemo3 {
public static void main(String[] args) {
//目标:掌握Stream流提供的常用的中间方法,对流上的数据进行处理(返回新流,支持链式编程)
List<String> list = new ArrayList<>();
list.add("张楚岚");
list.add("荒天帝");
list.add("叶天帝");
list.add("罗峰");
list.add("唐三");
list.add("李星云");
//1、过滤方法
list.stream().filter(name -> name.startsWith("张")).forEach(System.out::println);//forEach遍历每一个流并且都打印一次,是一个终结方法,而不是中间方法
//2、排序方法
List<Double> scores = new ArrayList<>();
scores.add(99.9);
scores.add(66.6);
scores.add(77.7);
scores.add(88.8);
scores.add(66.6);
scores.stream().sorted().forEach(System.out::println);//默认是升序
scores.stream().sorted((s1,s2) -> Double.compare(s2,s1)).forEach(System.out::println);//降序
scores.stream().sorted((s1,s2) -> Double.compare(s2,s1)).limit(2).forEach(System.out::println);//只要前两名
scores.stream().sorted((s1,s2) -> Double.compare(s2,s1)).skip(2).forEach(System.out::println);//跳过前两名
//如果希望自定义对象能够取去重复,重写对象的hashCode和euqals方法,才可以去重复
scores.stream().sorted((s1,s2) -> Double.compare(s2,s1)).distinct().forEach(System.out::println);//去重
//映射/加工方法,把流上原来的数据拿出来变成新数据又放到流上去
scores.stream().map(s -> "加十分后" + (s+10)).forEach(System.out::println);
//合并流,一次只能合并两个流
Stream<String> arr = Stream.of("张三", "张三丰", "张翠山", "张无忌");
Stream<Integer> arr2 = Stream.of(111,222);
Stream<Object> s3 = Stream.concat(arr, arr2);
System.out.println(s3.count());//6
}
}
Stream的终结方法
流只是用来操作数据,Stream终结方法将结果转回到集合或数组中去。流处理完毕数据一定要收集到集合或数组中去;
流只能收集一次

java
//获取薪水最高的老师对象,得给比较规则
Optional<Teacher> max =Teachers.stream().max((t1, t2) -> t1.getsalary() - Double.compare(t1.getsalary(), t2.getsalary()));
Teacher maxTeacher = max.get();//获取Optional对象中的元素
System.out.println(maxTeacher);

java
//收集到集合或数组中去
Stream<String> s1 = list.stream().filter(s -> s.startsWith("张"));
//收集到List集合(支持重复)
List<String> list1 = s1.collect(Collectors.toList());//流只能收集一次
System.out.println(list1);
//收集到Set集合(不支持重复)
Set<String> set = s1.collect(Collectors.toSet());
System.out.println(set1);
//收集到数组(可重复)
Stream<String> s3 = list.stream().filter(s -> s.startsWith("张"));
Object[] array = s3.toArray();
System.out.println("数组:"+ Arrays.toString(array));