• JAVA 8 新特性Stream初体验


    什么是 Stream?

    Stream(流)是一个来自数据源的元素队列并支持聚合操作

    • <strong元素队列< strong="">元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
    • 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
    • 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。

    和以前的Collection操作不同, Stream操作还有两个基础的特征:

    • Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
    • 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

    题目:

      有一个集合,里面存放字符串如:"小王,98"、"小李,95"、"小陈,87",要求打印输出所有成绩当中大于90分的数字。

    常规写法

     1     public static void main(String[] args) {
     2         ArrayList<String> arrayList=new ArrayList<String>();
     3         arrayList.add("小王,98");
     4         arrayList.add("小李,95");
     5         arrayList.add("小陈,87");
     6         for (int i = 0; i < arrayList.size(); i++) {
     7             String record=arrayList.get(i);
     8             String score=record.split(",")[1];
     9             int num =Integer.parseInt(score);
    10             if (num>90) {
    11                 System.out.println(num);
    12             }
    13         }
    14     }

    Stream方式

    1     public static void main(String[] args) {
    2         ArrayList<String> arrayList=new ArrayList<String>();
    3         arrayList.add("小王,98");
    4         arrayList.add("小李,95");
    5         arrayList.add("小陈,87");
    6         arrayList.stream().map(s->s.split(",")[1]).map(Integer::parseInt)
    7         .filter(n -> n > 90).forEach(System.out::println);
    8     }

    Stream方法详细介绍

     1     public static void main(String[] args) {
     2         //1.根据集合获取流
     3         ArrayList<String> arrayList=new ArrayList<String>();
     4         arrayList.add("小陈");
     5         arrayList.add("小王");
     6         arrayList.add("小李");
     7         Stream<String> streamA=arrayList.stream();
     8         
     9         //2.根据数组获取流,数组当中的元素必须是引用类型才行
    10         String[] arrayStr= {"Hello","World","Java"};
    11         Stream<String> streamB=Stream.of(arrayStr);
    12         
    13         Integer[] arrayIntegers= {10,20,30};
    14         Stream<Integer> streamC=Stream.of(arrayIntegers);
    15     }
    几种获取流方式

    一、生成流

    • stream() − 为集合创建串行流。

    • parallelStream() − 为集合创建并行流。

    串行流

    1     public static void main(String[] args) {
    2         //生成流,并筛选出不是空字符串的集合
    3         List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
    4         List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
    5         for (int i = 0; i < filtered.size(); i++) {
    6             System.out.println(filtered.get(i));
    7         }
    8     }

    并行流

    1     public static void main(String[] args) {        
    2         List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
    3         // 获取空字符串的数量
    4         long count = strings.parallelStream().filter(string -> string.isEmpty()).count();
    5         System.out.println(count);
    6     }

    二、forEach

    • Stream 提供了新的方法 'forEach' 来迭代流中的每个数据。
     1     public static void main(String[] args) {
     2         //使用forEach遍历打印集合中的数字
     3         ArrayList<Integer> arrayList=new ArrayList<Integer>();
     4         arrayList.add(1);
     5         arrayList.add(2);
     6         arrayList.add(3);
     7         arrayList.add(4);
     8         arrayList.add(5);
     9         arrayList.add(6);
    10         arrayList.stream().forEach(System.out::println);        
    11     }    

    三、map

    • map 方法用于映射每个元素到对应的结果,以下代码片段使用 map 输出了元素对应的平方数:
    1     public static void main(String[] args) {
    2         //使用map输出元素对应的平方
    3         List<Integer> numbers = Arrays.asList(1,2,3,4,5,6);
    4         numbers.stream().map(i->i*i).forEach(System.out::println);
    5     }

    四、filter

    • filter 方法用于通过设置的条件过滤出元素。
    1     public static void main(String[] args) {
    2         //使用 filter 方法过滤空字符串的个数
    3         List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
    4         long count = strings.stream().filter(string -> string.isEmpty()).count();
    5         System.out.println(count);
    6     }

    五、limit

    • limit 方法用于获取指定数量的流。
     1     public static void main(String[] args) {
     2         //使用 limit 方法打印出 3 条数据:
     3         ArrayList<Integer> arrayList = new ArrayList<Integer>();
     4         arrayList.add(1);
     5         arrayList.add(2);
     6         arrayList.add(3);
     7         arrayList.add(4);
     8         arrayList.add(5);
     9         arrayList.add(6);
    10         arrayList.stream().limit(3).forEach(System.out::println);
    11     }

    六、sorted

    • sorted 方法用于对流进行排序。以下代码片段使用 sorted 方法对输出的 10 个随机数进行排序:
     1     public static void main(String[] args) {        
     2         //使用 sorted 方法集合中的元素排序:
     3         ArrayList<Integer> arrayList = new ArrayList<Integer>();
     4         arrayList.add(1);
     5         arrayList.add(22);
     6         arrayList.add(13);
     7         arrayList.add(45);
     8         arrayList.add(50);
     9         arrayList.add(6);
    10         arrayList.stream().sorted().forEach(System.out::println);
    11     }

    七、Collectors

    • Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串:
    1     public static void main(String[] args) {
    2         List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
    3         List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
    4 
    5         System.out.println("筛选列表: " + filtered);
    6         String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
    7         System.out.println("合并字符串: " + mergedString);
    8     }

    八、统计

    • 一些产生统计结果的收集器也非常有用。它们主要用于int、double、long等基本类型上,它们可以用来产生类似如下的统计结果。
     1     public static void main(String[] args) {        
     2         List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
     3          
     4         IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
     5          
     6         System.out.println("列表中最大的数 : " + stats.getMax());
     7         System.out.println("列表中最小的数 : " + stats.getMin());
     8         System.out.println("所有数之和 : " + stats.getSum());
     9         System.out.println("平均数 : " + stats.getAverage());
    10     }
  • 相关阅读:
    fullCalendar改造计划之带农历节气节假日的万年历(转)
    Linked List Cycle
    Remove Nth Node From End of List
    Binary Tree Inorder Traversal
    Unique Binary Search Trees
    Binary Tree Level Order Traversal
    Binary Tree Level Order Traversal II
    Plus One
    Remove Duplicates from Sorted List
    Merge Two Sorted Lists
  • 原文地址:https://www.cnblogs.com/chenyanbin/p/11624500.html
Copyright © 2020-2023  润新知