JDK8的stream流的常用操作 您所在的位置:网站首页 stream流foreach获取map符合条件的值 JDK8的stream流的常用操作

JDK8的stream流的常用操作

#JDK8的stream流的常用操作| 来源: 网络整理| 查看: 265

stream流介绍 集合处理数据的弊端

当我们需要对集合中的元素进行操作的时候,除了必需的添加、删除、获取外,最典型的就是集合遍历。我们来体验集合操作数据的弊端,需求如下: 传统写法,代码如下:

public class Demo { public static void main(String[] args) { // 一个ArrayList集合中存储有以下数据:张无忌,周芷若,赵敏,张强,张三丰 // 需求:1.拿到所有姓张的 2.拿到名字长度为3个字的 3.打印这些数据 ArrayList list = new ArrayList(); Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张强", "张三丰"); // 1.拿到所有姓张的 ArrayList zhangList = new ArrayList(); // {"张无忌", "张强", "张三丰"} for (String name : list) { if (name.startsWith("张")) { zhangList.add(name); } } // 2.拿到名字长度为3个字的 ArrayList threeList = new ArrayList(); // {"张无忌", "张三丰"} for (String name : zhangList) { if (name.length() == 3) { threeList.add(name); } } // 3.打印这些数据 for (String name : threeList) { System.out.println(name); } } }

这段代码中含有三个循环,每一个作用不同:

首先筛选所有姓张的人; 然后筛选名字有三个字的人; 最后进行对结果进行打印输出。 每当我们需要对集合中的元素进行操作的时候,总是需要进行循环、循环、再循环。这是理所当然的么?不是。循环是做事情的方式,而不是目的。每个需求都要循环一次,还要搞一个新集合来装数据,如果希望再次遍历,只能再使用另一个循环从头开始。 那Stream能给我们带来怎样更加优雅的写法呢?Stream的更优写法 public class Demo { public static void main(String[] args) { // 一个ArrayList集合中存储有以下数据:张无忌,周芷若,赵敏,张强,张三丰 ArrayList list = new ArrayList(); Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张强", "张三丰"); // 1.拿到所有姓张的 2.拿到名字长度为3个字的 3.打印这些数据 list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).forEach(System.out::println); } }

直接阅读代码的字面意思即可完美展示无关逻辑方式的语义:获取流、过滤姓张、过滤长度为3、逐一打印。我们真正要做的事情内容被更好地体现在代码中。

Stream流式思想概述

注意:Stream和IO流(InputStream/OutputStream)没有任何关系,请暂时忘记对传统IO流的固有印象! Stream流式思想类似于工厂车间的“生产流水线”,Stream流不是一种数据结构,不保存数据,而是对数据进行加工处理。Stream可以看作是流水线上的一个工序。在流水线上,通过多个工序让一个原材料加工成一个商品。

获取Stream流的两种方式

获取一个流非常简单,有以下几种常用的方式:

所有的 Collection 集合都可以通过 stream 默认方法获取流; Stream 接口的静态方法 of 可以获取数组对应的流; 根据Collection获取流

首先, java.util.Collection 接口中加入了default方法 stream 用来获取流,所以其所有实现类均可获取流。

public interface Collection extends Iterable { default Stream stream() { return StreamSupport.stream(spliterator(), false); } } public class Demo { public static void main(String[] args) { // 方式1 : 根据Collection获取流 List list = new ArrayList(); Stream stream1 = list.stream(); Set set = new HashSet(); Stream stream2 = set.stream(); Map map = new HashMap(); Stream stream3 = map.keySet().stream(); Stream stream4 = map.values().stream(); Stream stream5 = map.entrySet().stream(); } } Stream中的静态方法of获取流

由于数组对象不可能添加默认方法,所以 Stream 接口中提供了静态方法 of。

public interface Stream extends BaseStream { public static Stream of(T t) { return StreamSupport.stream(new Streams.StreamBuilderImpl(t), false); } public static Stream of(T... values) { return Arrays.stream(values); } } public class Demo { public static void main(String[] args) { // 方式2 : Stream中的静态方法of获取流 Stream stream6 = Stream.of("aa", "bb", "cc"); String[] strs = {"aa", "bb", "cc"}; Stream stream7 = Stream.of(strs); // 基本数据类型的数组行不行?不行的,会将整个数组看做一个元素进行操作. int[] arr = {11, 22, 33}; Stream stream8 = Stream.of(arr); } } Stream常用方法和注意事项

Stream流模型的操作很丰富,这里介绍一些常用的API。这些方法可以被分成两种: image 终结方法:返回值类型不再是 Stream 类型的方法,不再支持链式调用。本小节中,终结方法包括count 和 forEach 方法。 非终结方法:返回值类型仍然是 Stream 类型的方法,支持链式调用。(除了终结方法外,其余方法均为非终结方法。)

Stream注意事项(重要) Stream只能操作一次 Stream方法返回的是新的流 Stream不调用终结方法,中间的操作不会执行 Stream流的forEach方法

forEach 用来遍历流中的数据

void forEach(Consumer


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有