1.Stream流的作用(流水线)
结合了Lambda表达式,简化集合、数组的操作;
2.Stream流的使用步骤
①先得到一条Stream流(流水线),并将数据放上去;
②利用Stream流中的API进行各种操作;
eg:过滤转换 【中间方法】:方法调用完毕后还可以调用其他方法;(使用次数较多)
统计打印 【终结方法】:方法调用完毕后不可以再调用其他方法(一般在最后使用)
③使用终结方法对流水线上的数据进行操作;
3.怎样执行2.①?
获取方式 | 方法名 | 说明 |
单列集合 | default Stream stream() | Collection中的默认方法 |
双列集合 | 需先通过KeySet()orentrySet()转化成单列集合 | … |
数组 | public static Streamstream(T[]array) | Array工具类中的静态方法 |
一堆零散数据 | public static Streamof(T…values) | Stream接口中的静态方法(数据类型尽量一致) |
代码演示:(单列集合)
import java.util.ArrayList;import java.util.Collections;import java.util.stream.Stream;public class Listof {public static void main(String[] args) {ArrayList list=new ArrayList();//创建单列集合Collections.addAll(list,"张三","李四","王五","赵六","思思","张小三","张小思");//批量添加//Stream stream=list.stream();//单列集合获取Stream流//过滤出单列集合中名字以”张“开头且长度为三的名称并进行打印list.stream().filter(name->name.startsWith("张")).filter(name->name.length()==3).forEach(name->System.out.println(name));System.out.println("*********************************************");//获取单列集合中名字是两个字的人名并进行打印list.stream().filter(name->name.length()==2).forEach(name->System.out.println(name));}}
双列集合:
import java.util.*;public class Listof {public static void main(String[] args) {//双列集合HashMap hm=new HashMap();hm.put(1,"妲己");hm.put(2,"小乔");hm.put(3,"安其拉");hm.put(4,"王昭君");hm.put(5,"甄姬");Set integers = hm.keySet();integers.stream().forEach(Key-> System.out.println(Key));System.out.println("***********************************");Set<Map.Entry> entries = hm.entrySet();entries.stream().filter(name->name.getValue().length()==3).forEach(name-> System.out.println(name));}}
数组,零散数据:
package Deom130;import java.util.Arrays;import java.util.stream.Stream;public class Listof {public static void main(String[] args) {//数组int []array1={1,2,3,4,5};String []array2={"a","b","c","d","e"};Arrays.stream(array1).forEach(s-> System.out.println(s));System.out.println("****************************");Arrays.stream(array2).forEach(s-> System.out.println(s));System.out.println("****************************");//零散数据Stream.of(1,2,3,4,5).forEach(s-> System.out.println(s));System.out.println("****************************");Stream.of("a","b","c","d","e").forEach(s-> System.out.println(s));}}
4.Stream流的中间方法(改变的只是流里面的数据,对原本集合中的数据不会有影响)
名称 | 说明 |
Streamfilter(Predicatepredicate | 过滤 |
Streamlimit(long maxSize) | 获取前几个元素 limit(3)就是获取前三个元素 |
Streamskip(long n) | 跳过前几个元素 |
Streamdistinct() | 去掉重复元素 |
staticStreamconcat(Stream a,Stream b) | 合并两个流为一个流(两个流上的数据类型尽量保持一致) |
Streammap(Function mapper) | 转换流中的数据类型 |
5.Stream流的终结方法
名称 | 说明 |
void forEach(Consumer action) | 遍历 |
long count() | 统计 |
toArray() | 收集流中的数据放到数组中 |
collect(Collector) | 收集流中的数据放到集合中 |
6.案例分析
import java.util.*;import java.util.stream.Collectors;public class Listof {public static void main(String[] args) {//定义一个集合,存储数据,过滤奇数。留下偶数,并存储到集合中ArrayList list1=new ArrayList();Collections.addAll(list1,1,2,3,4,5,6,7,8,9,10);List collect = list1.stream().filter(s -> s % 2 == 0).collect(Collectors.toList());System.out.println(collect);System.out.println("***********************************");ArrayList list2=new ArrayList();Collections.addAll(list2,"张三,23","李四,24","王五,25");Map collect1 = list2.stream().filter(s -> Integer.parseInt(s.split(",")[1]) > 24).collect(Collectors.toMap(s -> s.split(",")[0], s -> s.split(",")[1]));System.out.println(collect1);}}
需求:
有两个集合,分别存储六个演员年龄和姓名,现需男演员只要名字为3个字的前两个人,女演员只要姓杨的并且不要第一个,再将得到的两个集合合并为一个集合并且封装成以一个Actor对象,最后将数据存到集合list中;
实现代码:
import java.util.*;import java.util.stream.Collectors;import java.util.stream.Stream;public class Listof {public static void main(String[] args) {ArrayList list1=new ArrayList();Collections.addAll(list1,"蔡坤坤,24","比个耶,23","刘不甜,22","伍仟,24","谷嘉,30","肖梁梁,27");ArrayList list2=new ArrayList();Collections.addAll(list2,"赵小影,35","杨颖,36","高圆圆,43","张天天,31","刘诗,35","杨小幂,33");Stream boylimit = list1.stream().filter(s -> s.split(",")[0].length()==3).limit(2);Stream girlskip = list2.stream().filter(s -> s.split(",")[0].startsWith("杨")).skip(1);List collect = Stream.concat(boylimit, girlskip).map(s -> new Actor(s.split(",")[0], Integer.parseInt(s.split(",")[1]))).collect(Collectors.toList());System.out.println(collect);}}