1.什么是Stream流
Java8的两个重大改变,一个是lambda表达式另一个就是stream api表达式。Stream是Java8中处理集合的关键抽象感念,它可以对集合进行非常复杂的查找,过滤,筛选等操作。
2.为什么使用Stream流
当我们需要对集合中的元素进行操作的时候,除了必需的添加,删除,获取外,最经典的就是集合遍历。我们来体验集合操作数据的弊端,需求如下:
public class Test { public static void main(String[] args) { ArrayList<String> list=new ArrayList<>(); Collections.addAll(list,"刘陌","吴铭","王芯妍","姜娇娇","张文莉"); // 拿到所有姓张的 ArrayList<String> zhangList=new ArrayList<>(); for (String name:list){ if (name.startsWith("张")){ zhangList.add(name); } } // 拿到名字==3 ArrayList<String> nameLength=new ArrayList<>(); for (String name:zhangList){ if (name.length()==3){ nameLength.add(name); } } // 打印这些数据 for (String namd:nameLength){ System.out.println(namd); } } }
分析:
优化:性能比传统的快,支持多线程
public class Test02 { public static void main(String[] args) { ArrayList<String> list=new ArrayList<>(); Collections.addAll(list,"张陌雅","吴铭","王芯妍","姜娇娇","张文莉"); /* filter:过滤 * startsWith:字符串截取 * forEach:循环*/ list.stream() .filter(itme->itme.startsWith("张")) .filter(itme->itme.length()==3) .forEach(itme-> System.out.println(itme)); } }
3.Stream流的原理
4.如何获取Stream流对象
通过Collecton对象的Stream()或parallelStream()方法
通过Arrays类的Stream()方法
通过Stream接口的of(),iterate(),generate()方法
通过IntStream,LongStream,DoubleStream接口中的of,range,rangeClosed方法
获取并行流
5.Stream流中常见的API
中间操作api:一个操作的中间链,对数据源进行操作,而这种操作的返回类型还是一个Stream对象
中间操作:
过滤:filter();
public class Test04 { public static void main(String[] args) { List<person> list=new ArrayList<>(); list.add(new person("刘陌",23,"韩国",'M')); list.add(new person("吴铭",26,"韩国",'M')); list.add(new person("张文莉",23,"中国",'F')); list.add(new person("王芯妍",21,"中国",'F')); list.add(new person("迪丽热巴",23,"中国",'F')); // 1.找出年龄>18:filter():过滤器需要断言接口,返回true获取该元素,foreach() // 无论执行多少个中间操作,如果没有执行终止操作,那么中间操作都不会被执行 list.stream() .filter(itme->itme.getAge()>18) .forEach(System.out::println); // 2.找出所有中国人的数量:filter():过滤其他国家的人 count():终止操作 long count = list.stream() .filter(itme -> itme.getCountry().equals("中国")).count(); System.out.println(count); } } @Data @AllArgsConstructor @NoArgsConstructor class person{ private String name; private int age; private String country; private char sex; }
集合:map();
排序:sorted();
终止操作api:一个终止操作,执行中间操作链,并生产结果,返回类型不在是Stream流对象
终止操作:
循环:forEach();
统计:count();
最大:max();
最小:min();
规约:reduce()--参数和返回类型一致,可以实现对集合求和,求乘积和求最值;
收集:collect();
查询:find();
条件满足:match()