zoukankan      html  css  js  c++  java
  • Java Stream 流(JDK 8 新特性)

    什么是 Steam

    Java 8 中新增了 Stream(流)来简化集合类的使用,Stream 本质上是个接口,接口中定义了很多对 Stream 对象的操作。

    我们知道,Java 中 List 和 Set 集合都是基于 Collection 接口的扩展,在 Java 8 中新增了 stream( ) 方法来获取 Stream 对象,方法如下:

    default Stream<E> stream() {
        return StreamSupport.stream(spliterator(), false);
    }
    

    注意:这里的 default 也是 Java 8 中新引入的关键字,用于定义接口中方法的默认实现 。

    所以,Java 中 Set 和 List 的集合都包含这个方法,我们可以通过 stream() 方法获取这个集合的 Stream 对象

    Steam 的简单使用

    • 使用 for each 求和
    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
    int sum = 0;
    for (Integer element : list ) {
      sum += element;
    }
    System.out.println(sum);
    
    • 使用 Stream 求和
    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
    int sum = list.stream().reduce(0, (acc, value) -> acc + value);
    System.out.println(sum);
    

    reduce 方法的作用下面有介绍

    改成这样一目了然,代码变得非常干净利索。

    上面代码先通过 stream() 方法获取 Stream 对象,然后调用 Stream 中的 reduce 方法计算,然后获取结果。

    Stream 主要方法

    Stream 中主要包含如下几个方法:

    • collect(toList()):通过 Stream 生成一个列表

    • map:将流中的一个值转换成一个新的值

    • filter: 过滤 Stream 中的元素

    • flatMap: 将多个 Stream 连接成一个 Stream

    • max: 求最大值

    • min: 求最小值

    • reduce: 从一组值中生成一个新的值

    Stream 方法的使用

    • collect(toList()) 和 filter 方法的使用
    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
    List<Integer> result = list.stream().filter((value) -> value > 2).collect(toList());
    result.forEach((value) -> System.out.print(value));
    

    上面的代码先创建了一个 List 对象并初始化,然后使用 filter 方法筛选出集合元素大于 2 的值,再用 collect(toList()) 将筛选出的结果存放到新生成的 List 集合中,最后用 forEach 遍历集合打印集合元素。

    • map 方法的使用
    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
    List<String> result = list.stream().map(value -> String.format("String:%s", value)).collect(toList());
    result.forEach((value) -> System.out.print(value));
    

    上面的代码先创建了一个 List 对象并初始化,然后使用 map 方法将集合的 Integer 元素转换成 String ,再使用 collect(toList()) 方法生成一个新的 List 集合,最用 forEach 遍历集合打印集合元素。

    • flatMap 方法的使用
    List<String> list = Arrays.asList("abc", "def", "ghi");
    List<Character> result = list.stream().flatMap(value -> {
    char[] chars = value.toCharArray();
    Character[] characters = new Character[chars.length];
    for(int i = 0; i < characters.length; i++){
    characters[i] = chars[i];
    }
    return Stream.of(characters);
    }).collect(toList());
    result.forEach((value) -> System.out.print(value));
    

    上面代码先遍历 list ,通过 flatMap 方法将每个 String 元素都生成一个新的 Stream 并将这些 Stream 连接成一个新的 Stream

    • max 和 min 方法的使用
    List<Integer> list = Arrays.asList(0, 1, 2, 3);
    Comparator<Integer> comparator = (o1, o2) -> o1.compareTo(o2);
    System.out.println(list.stream().min(comparator).get());
    System.out.println(list.stream().max(comparator).get());
    

    min 和 max 方法需要一个 Comparator 对象为参数作为比对依据。

    • reduce 方法的使用

    reduce 方法的用途非常广泛,作用也比较大

    List<Integer> list = Arrays.asList(0, 1, 2, 3);
    int count = list.stream().reduce(0, (acc, item) -> acc + item).intValue();
    System.out.println(count);
    

    reduce 方法的一个参数为循环的初始值,这里计算累加时初始值为 0,acc 代表已经计算的结果,item 表示循环的每个元素

    总结

    Stream 流是 JDK 8 新特性中用于简化集合类的使用,可以让代码看起来更加简洁干净。

    作者:Binge
    本文版权归作者和博客园共有,转载必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    [JSOI2007][BZOJ1030] 文本生成器|AC自动机|动态规划
    [NOI2014][BZOJ3670] 动物园|KMP
    [HAOI2010][BZOJ2427] 软件安装|tarjan|树型dp
    [JSOI2008][BZOJ1017] 魔兽地图DotR|树型dp
    [JLOI2014][BZOJ3631] 松鼠的新家|树上倍增LCA|差分
    [SDOI2010][BZOJ1975] 魔法猪学院|A*|K短路
    [BZOJ1251] 序列终结者|Splay
    hdu 2141 Can you find it?
    hdu 3152 Obstacle Course
    hdu 2680 Choose the best route
  • 原文地址:https://www.cnblogs.com/binbingg/p/13672887.html
Copyright © 2011-2022 走看看