📜  Java流Stream

📅  最后修改于: 2020-03-28 13:37:16             🧑  作者: Mango

Java 8中引入了Stream API,用于处理对象的集合。流是支持各种方法的对象序列,可以将这些方法通过管道传输以产生所需的结果。
Java流的功能是:

  • 流不是数据结构,而是从集合、数组或I/O通道获取输入。
  • 流不更改原始数据结构,它们仅根据流水线方法提供结果。
  • 每个中间操作都是延迟执行的,并因此返回一个流,因此可以对各种中间操作进行流水线处理。终端操作标记流的结尾并返回结果。

流上的不同操作:
中级操作:

  1. map: map方法用于返回一个流,该流包含将给定函数应用于此流的元素的结果。
    List number = Arrays.asList(2,3,4,5);
    List square = number.stream().map(x->x*x).collect(Collectors.toList());
  2. filter: filter方法用于根据作为参数传递的谓词选择元素。
    List names = Arrays.asList("Reflection","Collection","Stream");
    List result = names.stream().filter(s->s.startsWith("S")).collect(Collectors.toList());
  3. sorted: sorted方法用于对流进行排序。
    List names = Arrays.asList("Reflection","Collection","Stream");
    List result = names.stream().sorted().collect(Collectors.toList());

终端操作:

  1. collect: collect方法用于返回对流执行的中间操作的结果。
    List number = Arrays.asList(2,3,4,5,3);
    Set square = number.stream().map(x->x*x).collect(Collectors.toSet());
  2. forEach: forEach方法用于迭代流的每个元素。
    List number = Arrays.asList(2,3,4,5);
    number.stream().map(x->x*x).forEach(y->System.out.println(y));
  3. reduce: reduce方法用于将流的元素减少为单个值。
    reduce方法将BinaryOperator用作参数。List number = Arrays.asList(2,3,4,5);
    int even = number.stream().filter(x->x%2==0).reduce(0,(ans,i)-> ans+i);

    在这里,ans变量被分配为0作为初始值,并且i被添加到它。

演示使用Stream的程序

//  Java展示Stream流操作
import java.util.*;
import java.util.stream.*;
class Demo
{
  public static void main(String args[])
  {
    // 创建int的list
    List number = Arrays.asList(2,3,4,5);
    // 使用map方法
    List square = number.stream().map(x -> x*x).
                           collect(Collectors.toList());
    System.out.println(square);
    // 创建一个String的list
    List names =
                Arrays.asList("Reflection","Collection","Stream");
    // 使用filter方法
    List result = names.stream().filter(s->s.startsWith("S")).
                          collect(Collectors.toList());
    System.out.println(result);
    // 使用sorted方法
    List show =
            names.stream().sorted().collect(Collectors.toList());
    System.out.println(show);
    // 创建你一个int的list
    List numbers = Arrays.asList(2,3,4,5,2);
    // collect方法返回一个集合
    Set squareSet =
         numbers.stream().map(x->x*x).collect(Collectors.toSet());
    System.out.println(squareSet);
    // 展示如何使用forEach方法
    number.stream().map(x->x*x).forEach(y->System.out.println(y));
    //  展示reduce方法
    int even =
       number.stream().filter(x->x%2==0).reduce(0,(ans,i)-> ans+i);
    System.out.println(even);
  }
}

输出:

[4, 9, 16, 25]
[Stream]
[Collection, Reflection, Stream]
[16, 4, 9, 25]
4
9
16
25
6

要点/观察:

  1. 流由源组成,然后是零个或更多个中间方法(组合在一起)(流水线),以及根据描述的方法处理从源获得的对象的终端方法。
  2. 流用于按照流水线方法计算元素,而不会更改对象的原始值。