JDK8 Lambda表达式之Stream流(四)

354 阅读2分钟

集合的处理数据的弊端

当我们需要对集合中的元素进行操作的时候,除了必要的增、删、查外,最典型的就是遍历,,我们来体验下操作记得的弊端,需求如下:

  1. 拿到所有姓张的

  2. 拿到长度小于3的,打印出来

    代码如下

public static void main(String[] args) {
        List<String> listName  = new ArrayList();
        Collections.addAll(listName,"张无忌","周芷若","赵敏","张强","张三丰","金轮法王");

        List<String> zhangList  = new ArrayList();
        for (String name :listName){
            if(name.contains("张")){
                zhangList.add(name);
            }
        }
        System.out.println(zhangList);
        List<String> threeList  = new ArrayList();
        for (String name :zhangList){
            if(name.length()<3){
                threeList.add(name);
            }
        }
        System.out.println(threeList);

    }

Stream流的思想概述

注意: Stream 流和IO流(inputStream/outStream)没有任何关系,请暂停忘记对传统IO流的固有印象。

stream流式思想概述

stream流式思想类似于工厂车间的“生产流水线”, stream流不是一种数据结构,不保存数据,而是对数据进行加工处理。Stream可以看作是流水线的一个工序。在流水线上, 通过多个工序让一个原材料加工成一个商品。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzMxODEzNA==,size_16,color_FFFFFF,t_70.png watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dhb2d6aGVu,size_16,color_FFFFFF,t_70.png

这张图中展示了过滤、映射、跳过、计数等多步操作,这是一种集合元素的处理方案,而方案就是一种“函数模型”。图中的每一个方框都是一个“流”,调用指定的方法,可以从一个流模型转换为另一个流模型。而最右侧的数字 3是最终结果。

  这里的 filter 、 map 、 skip 都是在对函数模型进行操作,集合元素并没有真正被处理。只有当终结方法 count 执行的时候,整个模型才会按照指定策略执行操作。

Stream流能够让我们能够快速的完成许多复杂的操作,如筛选、切片、映射、查找、去重、统计、匹配和规约等。

获取Stream流的方式

java.util.stream.Stream<T> 是Java 8新加入的最常用的流接口。(这并不是一个函数式接口。) 获取一个流非常简单,有以下几种常用的方式:  * 所有的Collection 集合都可以通过stream 默认方法获取流;  * Stream 接口的静态方法of 可以获取数组对应的流。

方式1 : 根据Collection 获取流

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

default Stream<E> stream() {
        return StreamSupport.stream(spliterator(), false);
}
 public static void main(String[] args) {
        //方式1 : 根据Collection获取流
        //Collection接口有一个默认的方法,default Stream<E> stream()
        List<String> list = new ArrayList();
        Stream<String> stream =  list.stream();

        Set<String> set = new HashSet();
        Stream<String> stream2 =  set.stream();

        Map<String,String> map = new HashMap<>();
        Stream<String> stream3 = map.keySet().stream();
        Stream<String> stream4 =map.values().stream();
        Stream<Map.Entry<String, String>> stream5 = map.entrySet().stream();
    }

方式二: Stream中的静态方法of获取流

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

 public static void main(String[] args) {
        //方式2 : Stream静态方法of获取流
        Stream<String> stream6 = Stream.of("aa", "bb", "cc");

        String[] str = {"11","22","33"};
        Stream<String> stream7 = Stream.of(str);

        //基本数据类型的数组行不行?不行的,会将整个数组看做一个元素进行操作
        int[] arr = {11,22,33};
        Stream<String> stream8 = Stream.of(str);
    }