当前位置 : 主页 > 编程语言 > 其它开发 >

Stream流操作 #2

来源:互联网 收集:自由互联 发布时间:2022-06-21
简单看看 Stream 流。 Stream流操作 #2 工作中总是见到这种之前没见过的用法,必须学习一下了。 Stream 流是 Java8 的新特性,通过它可以以声明的方式处理数据。Stream 使用一种类似用 SQL
简单看看 Stream 流。 Stream流操作 #2

工作中总是见到这种之前没见过的用法,必须学习一下了。

Stream 流是 Java8 的新特性,通过它可以以声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

+--------------------+       +------+   +---+   +------+   +-------+
| stream of elements +-----> |filter+-> |map+-> |sorted+-> |collect|
+--------------------+       +------+   +---+   +------+   +-------+
什么是 Stream

Stream(流)是来自数据源的元素队列,且可以进行一系列的聚合操作。

  1. 元素是特定类型的对象,形成一个队列。
  2. 数据源:流的来源。可以是集合,数组,I/O channel, 产生器 generator 等。
  3. 聚合操作:类似SQL语句一样的操作, 如 filter、map、reduce、find、match、sorted 等。
  4. Pipelining:在流中的操作都会返回流对象本身,因此多个操作可以串联成一个管道,如同水流过在不同的管道中进行处理一样。
  5. 内部迭代:之前对集合进行遍历都是通过迭代器 Iterator 或外部 For-Each 的方式,但 Stream 提供了内部迭代的 forEach 方法,由访问者模式实现。
流操作 生成流

在 Java8 中有两个方式生成流:

  1. 使用 stream() 创建串行流;
  2. 使用 parallelStream() 创建并行流。
List<String> strings = Arrays.asList("abc", "id", "qiyuanc", "fqqy", "fgh","jkl");
strings.stream();
strings.parallelStream();
forEach

通过 Stream 流提供的 forEach 方法可以在内部对集合进行遍历:

public class Demo {
    @Test
    public void Demo1(){
        List<String> strings = Arrays.asList("abc", "id", "qiyuanc", "fqqy", "fgh", "jkl");
        strings.stream().forEach(System.out::println);
    }
}
/*
abc
id
qiyuanc
fqqy
fgh
jkl
*/
filter

通过 Stream 流中的 filter 方法,可以对元素进行一些过滤操作,此处过滤掉空串后接上上面的内部迭代:

public class Demo {
    @Test
    public void Demo1(){
        // 集合中有空串
        List<String> strings = Arrays.asList("abc", "", "id", "qiyuanc", "fqqy", "", "fgh", "jkl");
        // 过滤空串
        strings.stream().filter(s -> !s.isEmpty()).forEach(System.out::println);
    }
}
/*
abc
id
qiyuanc
fqqy
fgh
jkl
*/
map

map 是一个非常强大的功能,这个操作会遍历流,并可以将其中的元素映射到对应的结果:

public class Demo {
    @Test
    public void Demo1(){
        // 集合
        List<String> strings = Arrays.asList("abc", "", "id", "qiyuanc", "fqqy", "", "fgh", "jkl");
        // 过滤空串 并映射为对应的结果
        strings.stream().filter(s -> !s.isEmpty()).map( s -> s + "/map").forEach(System.out::println);
    }
}
/*
abc/map
id/map
qiyuanc/map
fqqy/map
fgh/map
jkl/map
*/
sorted

sorted 操作可以对流进行排序,使用非常简单:

public class Demo {
    @Test
    public void Demo1(){
        // 集合
        List<String> strings = Arrays.asList("abc", "", "id", "qiyuanc", "fqqy", "", "fgh", "jkl");
        // 过滤空串 并映射为对应的结果
        strings.stream().filter(s -> !s.isEmpty()).map( s -> s + "/map").sorted().forEach(System.out::println);
    }
}
/*
abc/map
fgh/map
fqqy/map
id/map
jkl/map
qiyuanc/map
*/
collector

collector 操作的参数是 Collectors 类的方法,这个类实现了许多归约操作,可以将流转换为集合或聚合元素,一般用在流的结尾,也表明这个流已经处理完毕:

public class Demo {
    @Test
    public void Demo1(){
        // 原集合
        List<String> strings = Arrays.asList("abc", "", "id", "qiyuanc", "fqqy", "", "fgh", "jkl");
        // 流 转换为 集合
        List<String> stringList = strings.stream().filter(s -> !s.isEmpty()).map( s -> s + "/map").sorted().collect(Collectors.toList());
        // 流 转换为 聚合
        String stringJoin = strings.stream().filter(s -> !s.isEmpty()).map( s -> s + "/map").sorted().collect(Collectors.joining(","));
        System.out.println("转换为集合:" + stringList);
        System.out.println("转换为聚合:" + stringJoin);
    }
}
/*
转换为集合:[abc/map, fgh/map, fqqy/map, id/map, jkl/map, qiyuanc/map]
转换为聚合:abc/map,fgh/map,fqqy/map,id/map,jkl/map,qiyuanc/map
*/

流的功能还是非常强大的!而且流的操作还不只这些,在这只是列举了一些比较常用的。

上一篇:6000字Locust入门详解
下一篇:没有了
网友评论