在Java 8中,得益于Lambda所带来的函数式编程,引入了一个全新的Stream流概念,用于简化集合和数组操作的API。
Stream流的三类方法:
集合获取Stream流的方式:可以用Collection接口中的默认方法stream()生成Stream流:
数组获取Stream流的方式:
System.out.println("Collection集合获取Stream流");
Collection<String> list = new ArrayList<>();
Stream<String> s = list.stream();
System.out.println("Map集合获取流");
Map<String,Integer> maps = new HashMap<>();
//键流
Stream<String> keyStream = maps.keySet().stream();
//值流
Stream<Integer> valueStream = maps.values().stream();
//键流类(拿整体)
Stream<Map.Entry<String,Integer>> keyAndValueStream = maps.entrySet().stream();
System.out.println("数组获取Stream流");
String[] names = {"12","13","14","15"};
Stream<String> nameStream = Arrays.stream(names);
//还有一种写法
Stream<String> nameStream2 = Stream.of(names);
Stream流常用API:
//Stream流常用API
//Stream支持链式编程
list2.stream().filter(s1->s1.startsWith("1")).forEach(s1->System.out.println(s1));
//到了foreach没有返回值了,流结束
//s代表每一个元素
long size = list2.stream().filter(s1->s1.length()==3).count();
System.out.println(size);
//根据提示知count的返回值为long
list2.stream().filter(s1->s1.startsWith("1")).limit(2).forEach(s1->System.out.println(s1));
//1开头的,只要前两个
//"forEach(s1->System.out.println(s1))"中两处s1是一样的,可简化为方法引用:
list2.stream().filter(s1->s1.startsWith("1")).limit(2).forEach(System.out::println);
list2.stream().skip(2).forEach(System.out::println);
//Map加工方法
//给集合元素前面都加上一个'n'
list2.stream().map(s1->"n"+s1).forEach(System.out::println);
//把所有名称都加工成学生类对象
list2.stream().map(s1->new Student(s1)).forEach(s1->System.out.println(s1));
//两处s1是一样的,可构造器引用 方法引用
list2.stream().map(Student::new).forEach(System.out::println);
//合并流
Stream<String> st1 = list2.stream().filter(s1->s1.startsWith("1"));
Stream<String> st2 = Stream.of("java1","java2");
Stream<String> st3 = Stream.concat(st1,st2);//只能合并两个
st3.forEach(s1 -> System.out.println(s1));
注意:Stream流无法修改集合数组中的数据
Stream流常见终结操作方法:
Stream收集操作:
把Stream流操作后的结果数据转回到集合或数组中去 。
Stream流收集方法:
Collectors工具类提供了具体收集方式:
Stream<String> s3 = list2.stream().filter(s1->s1.startsWith("1"));//过滤完之后的结果还是stream流,定义一个stream流的变量来接
//收集到list集合中
List<String> onelists = s3.collect(Collectors.toList());//tolist:告诉collector方法以list形式收集元素
System.out.println(onelists);
Stream<String> s4 = list2.stream().filter(s1->s1.startsWith("1"));
Set<String> onelists1 = s4.collect(Collectors.toSet());//前面应该再定义一条stream流
//会去掉重复的
System.out.println(onelists1);
Stream<String> s5 =list2.stream().filter(s1->s1.startsWith("1"));
s5.toArray();//收集成数组
System.out.println(Arrays.toString(arrs));
注意:流只能使用一次,里面数据被收集走后,里面没有数据了