zoukankan      html  css  js  c++  java
  • Java8中Stream详解

    Java8提供了Stream(流)处理集合的关键抽象概念,它可以对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。Stream API 借助于同样新出现的Lambda表达式,极大的提高编程效率和程序可读性。

    1.Java Stream vs Collection

    我们列出流相比于Collection的不同的特征:

    • 不是数据结构
    • 需要用lambdas表达式
    • 不能用下标访问
    • 可以容易的被聚合为数组或者列表
    • 懒访问支持
    • 可并行

    英文表述如下:

    • Not a data structure
    • Designed for lambdas
    • Do not support indexed access
    • Can easily be aggregated as arrays or lists
    • Lazy access supported
    • Parallelizable

    2.创建流

    2.1 Stream.of()
    Stream<Integer> stream = Stream.of(1,2,3,4,5,6,7,8,9);
    stream.forEach(p -> System.out.println(p));
    2.2. Stream.of(array)
     Stream<Integer> stream = Stream.of( new Integer[]{1,2,3,4,5,6,7,8,9} );
     stream.forEach(p -> System.out.println(p));
    2.3. List.stream()
             List<Integer> list = new ArrayList<Integer>();
             for(int i = 1; i< 10; i++){
                 list.add(i);
             }
             Stream<Integer> stream = list.stream();
             stream.forEach(p -> System.out.println(p));
    2.4. Stream.generate() or Stream.iterate()
             Stream<Integer> randomNumbers = Stream
                 .generate(() -> (new Random()).nextInt(100));
    
             randomNumbers.limit(20)
                  .forEach(System.out::println);
    2.5. Stream of String chars or tokens
            IntStream stream = "12345_abcdefg".chars();
            stream.forEach(p -> System.out.println(p));
            
        //OR
            
            Stream<String> stream = Stream.of("A$B$C".split("\$"));
            stream.forEach(p -> System.out.println(p));

    3. Stream Collectors

    在执行过中间操作之后,我们会用stream的Collector方法收集处理的元素到集合中。

    3.1 收集流元素到列表(List)
             List<Integer> list = new ArrayList<Integer>();
             for(int i = 1; i< 10; i++){
                 list.add(i);
             }
             Stream<Integer> stream = list.stream();
             List<Integer> evenNumbersList = stream.filter(i -> i%2 == 0)
                                                    .collect(Collectors.toList());
             System.out.print(evenNumbersList);
    3.2 收集流元素到数组(Array)
    Stream<Integer> stream = list.stream();
             Integer[] evenNumbersArr = stream.filter(i -> i%2 == 0).toArray(Integer[]::new);

    你也可以收集流到Set, Map 等中。

    4.流操作

    先准备一个列表数据

    List<String> memberNames = new ArrayList<>();
    memberNames.add("Amitabh");
    memberNames.add("Shekhar");
    memberNames.add("Aman");
    memberNames.add("Rahul");
    memberNames.add("Shahrukh");
    memberNames.add("Salman");
    memberNames.add("Yana");
    memberNames.add("Lokesh");
    4.1 中间操作

    中间操作返回一个流,所以我们可以在一行关联多个方法。

    4.1.1. Stream.filter()

    memberNames.stream().filter((s) -> s.startsWith("A"))
                        .forEach(System.out::println);

    输出;

    Amitabh
    Aman

    4.1.2. Stream.map()

    map中间操作通过给出函数转换流中的每个元素为另一个对象

     memberNames.stream().filter((s) -> s.startsWith("A"))
                         .map(String::toUpperCase)
                         .forEach(System.out::println);    
    4.2. 终端操作

    4.2.1. Stream.forEach()

    memberNames.forEach(System.out::println);

    4.2.2. Stream.collect()

    List<String> memNamesInUppercase = memberNames.stream().sorted()
                                .map(String::toUpperCase)
                                .collect(Collectors.toList());
            
    System.out.print(memNamesInUppercase);

    4.2.3. Stream.match()

    所有的matching操作都是终端从挨揍,并且返回boolean 结果

    boolean matchedResult = memberNames.stream()
            .anyMatch((s) -> s.startsWith("A"));
    System.out.println(matchedResult);
    
    matchedResult = memberNames.stream()
            .allMatch((s) -> s.startsWith("A"));
    System.out.println(matchedResult);
    
    matchedResult = memberNames.stream()
            .noneMatch((s) -> s.startsWith("A"));
    System.out.println(matchedResult);

    4.2.4. Stream.count()

    long totalMatched = memberNames.stream()
        .filter((s) -> s.startsWith("A"))
        .count();

    4.2.5. Stream.reduce()

    reduce()方法根据给出的函数执行流上元素的减少操作,结果是Optional接收这个reduced value。

    we are reducing all the strings by concatenating them using a separator #.

    Optional<String> reduced = memberNames.stream()
            .reduce((s1,s2) -> s1 + "#" + s2);
    
    reduced.ifPresent(System.out::println);

    输出:

    Amitabh#Shekhar#Aman#Rahul#Shahrukh#Salman#Yana#Lokesh

    5. Stream 流中的短路操作

    5.1. Stream.anyMatch()
    boolean matched = memberNames.stream()
            .anyMatch((s) -> s.startsWith("A"));
    5.2. Stream.findFirst()
    String firstMatchedName = memberNames.stream()
                .filter((s) -> s.startsWith("L"))
                .findFirst()
                            .get();

    6.Java Steam中的并发操作

    List<Integer> list = new ArrayList<Integer>();
             for(int i = 1; i< 10; i++){
                 list.add(i);
             }
             
            //Here creating a parallel stream
             Stream<Integer> stream = list.parallelStream();    
    
             Integer[] evenNumbersArr = stream.filter(i -> i%2 == 0).toArray(Integer[]::new);
             System.out.print(evenNumbersArr);

    参考网址:

    https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html

    https://blog.csdn.net/pan_junbiao/article/details/105913518

    https://howtodoinjava.com/java8/java-streams-by-examples/

    https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html

  • 相关阅读:
    keep-alive的深入理解与使用(配合router-view缓存整个路由页面)
    vue无法自动打开浏览器
    解决vue页面刷新或者后退参数丢失的问题
    vue 跳转并传参,实现数据实时更新
    Struts2 有关于无法正常的使用通配符
    有关于java反编译工具的使用
    Action名称的搜索顺序
    Struts2 的 值栈和ActionContext
    在Action 中访问web资源
    oracle 创建database Link
  • 原文地址:https://www.cnblogs.com/Vincent-yuan/p/14839363.html
Copyright © 2011-2022 走看看