使用Stream API操作集合
假设现在有一批名字数据,需要筛选出姓张的人
后来需求又变了,需要筛选出姓张,而且名字长度大于等于3的人
使用传统方式操作集合
只要操作集合都不得不需要使用循环遍历元素
每次筛选后都需要使用新的集合存储元素
package net.ittimeline.java.core.jdk.feature.java8.stream;import lombok.extern.log4j.Log4j2;import java.util.ArrayList;import java.util.List;/** * 传统方式操作集合和stream操作集合 * * @author tony 18601767221@163.com * @version 2020/12/25 13:11 * @since JDK11 */@Log4j2public class ListFilterDataTest { public static void main(String[] args) { List list = new ArrayList<>(); list.add("刘德华"); list.add("郭富城"); list.add("张学友"); list.add("黎明"); list.add("张国荣"); list.add("张杰"); List zhangList = new ArrayList<>(); // 将姓张的名字存放到一个新的集合汇总 for (String name : list) { if (name.startsWith("张")) { zhangList.add(name); } } List result = new ArrayList<>(); // 将长度大于等于3的名字 for (String name : zhangList) { if (name.length() >= 3) { result.add(name); } } log.info("结果:{}", result); // 只要操作集合都不得不需要使用循环遍历元素 // 每次筛选后都需要使用新的集合存储元素 }}
程序运行结果
使用Stream API操作集合
不需要遍历集合、而且不需要创建新的集合存放结果
package net.ittimeline.java.core.jdk.feature.java8.stream;import lombok.extern.log4j.Log4j2;import java.util.ArrayList;import java.util.List;/** * stream流操作集合数据 * * @author tony 18601767221@163.com * @version 2020/12/25 13:19 * @since JDK11 */@Log4j2public class StreamFilterDataTest { public static void main(String[] args) { List list = new ArrayList<>(); list.add("刘德华"); list.add("郭富城"); list.add("张学友"); list.add("黎明"); list.add("张国荣"); list.add("张杰"); list.stream().filter(name->name.startsWith("张")).filter(name->name.length()>=3).forEach(( name)->{ log.info(name); }); }
程序运行结果
流式编程思想
流式编程思想来自于工厂的流水线,在使用流之前需要搭建函数模型。例如list.stream().filter(name->name.startsWith("张")).filter(name->name.length()>=3).forEach(( name)->{ log.info(name); });就是函数模型
- 函数模型必须要有终结的方法,也就是返回值类型不为Stream的方法。例如forEach()方法的返回值就是void
- 函数模型要有延迟方法,即返回值为Stream的方法,例如stream(),fliter()方法都是延迟方法
- Stream流不能重复使用
- Stream流不能存储数据,也不会修改数据源。
获取流的方式
获取流也就是流要有多个数据,而Java中支持存储多个数据的容器是数组或者集合。
JDK1.8以后Collection接口增加了一个默认方法:default S