Stream流
- 流的基本概念
- 什么是流 :
- Stream是操作集合的一种计算数据的工具 集合就是数据,Stream是计算集合中的数据的工具 流是Java8引入的全新概念(Java8 新特性)它用来处理集合中的数据,暂且可以把它理解为一种高级集合
- 集合操作非常麻烦,若要对集合进行筛选、投影,需要写大量的代码,而流是以声明的形式操作集合,它就像SQL语句,我们只需告诉流需要对集合进行什么操作,它就会自动进行操作,并将执行结果交给你,无需我们自己手写代码 因此,流的集合操作对我们来说是透明的,我们只需向流下达命令,它就会自动把我们想要的结果给我们。由于操作过程完全由Java处理,因此它可以根据当前硬件环境选择最优的方法处理,我们也无需编写复杂又容易出错的多线程代码了
- 流的特点
- 只能遍历一次:我们可以把流想象成一条流水线,流水线的源头是我们的数据源(一个集合),数据源中的元素依次被输送到流水线上,我们可以在流水线上对元素进行各种操作。一旦元素走到了流水线的另一头,那么这些元素就被“消费掉了”,我们无法再对这个流进行操作。当然,我们可以从数据源那里再获得一个新的流重新遍历一遍
- 采用内部迭代方式:若要对集合进行处理,则需我们手写处理代码,这就叫做外部迭代 而要对流进行处理,我们只需告诉流我们需要什么结果,处理过程由流自行完成,这就称为内部迭代
- 什么是流 :
- 在使用流式编程之前需要前置知识 四大函数式接口 这四种函数式接口就是我们通常使用的方法的一种抽象 如 Function接口就是一种方法 一个输入 一种返回值
- 函数型接口Function:有一个输入,一个返回值
-
源码:
-
代码演示:获取字符串长度
public static void main(String[] args) { String string = "我就是一个字符串!"; // 函数式接口能使用Lambda表达式 这里不是重点 不在详述 int length = getLength(string, (str) -> str.length()); System.out.println(length); } // 获取字符串的长度 private static int getLength(String string, Function<String , Integer> function){ return function.apply(string); }
-
- 断定型接口Predicate:有一个输入,返回布尔值
-
源码:
-
代码演示: 筛选出名字长度为两个字的人名
public static void main(String[] args) { List<String> list = Arrays.asList("张三", "李四", "王五", "赵六", "黄飞鸿", "王麻子"); List<String> stringList = screenName(list, (str) -> str.length() == 2); System.out.println(stringList); } private static List<String> screenName(List<String> list, Predicate<String> predicate){ List<String> nameList = new ArrayList<>(); for (String s : list) { if (predicate.test(s)){ nameList.add(s); } } return nameList; }
-
- 消费型接口Consumer:有一个输入参数,没有返回值
- 源码
- 代码演示:吃包子付钱
public static void main(String[] args) { payMoney(6, (num) -> System.out.println("包子一共是"+num * 2 +"元钱") ); } private static void payMoney(int baozi, Consumer<Integer> consumer){ consumer.accept(baozi); }
- 源码
- 供给型接口Supplier:没有输入,只有返回参数
-
源码:
-
代码演示:
public static void main(String[] args) { Employee employee = getEmployee(() -> new Employee()); System.out.println(employee); } private static Employee getEmployee(Supplier<Employee> supplier){ Employee employee = supplier.get(); return employee; }
-
- 函数型接口Function:有一个输入,一个返回值
- 流的操作种类 流的操作分为两种,分别为中间操作 和 终端操作