Java中的流
在Java 8 中引入的 Stream API 用于处理对象的集合。流是支持各种方法的对象序列,这些方法可以流水线化以产生所需的结果。
Java流的特点是——
- 流不是数据结构,而是从集合、数组或 I/O 通道获取输入。
- 流不会更改原始数据结构,它们仅根据流水线方法提供结果。
- 每个中间操作都被延迟执行并返回一个流作为结果,因此可以对各种中间操作进行流水线化。终端操作标记流的结束并返回结果。
流上的不同操作-
中间操作:
- map: map 方法用于返回一个流,该流由将给定函数应用于该流的元素的结果组成。
List number = Arrays.asList(2,3,4,5);
List square = number.stream().map(x->x*x).collect(Collectors.toList()); - 过滤器:过滤器方法用于根据作为参数传递的谓词选择元素。
List names = Arrays.asList("Reflection","Collection","Stream");
List result = names.stream().filter(s->s.startsWith("S")).collect(Collectors.toList()); - sorted: sorted 方法用于对流进行排序。
List names = Arrays.asList("Reflection","Collection","Stream");
List result = names.stream().sorted().collect(Collectors.toList());
终端操作:
- collect: collect 方法用于返回对流执行的中间操作的结果。
List number = Arrays.asList(2,3,4,5,3);
Set square = number.stream().map(x->x*x).collect(Collectors.toSet()); - forEach: forEach 方法用于遍历流的每个元素。
List number = Arrays.asList(2,3,4,5);
number.stream().map(x->x*x).forEach(y->System.out.println(y)); - 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 使用的程序
//a simple program to demonstrate the use of stream in java
import java.util.*;
import java.util.stream.*;
class Demo
{
public static void main(String args[])
{
// create a list of integers
List number = Arrays.asList(2,3,4,5);
// demonstration of map method
List square = number.stream().map(x -> x*x).
collect(Collectors.toList());
System.out.println(square);
// create a list of String
List names =
Arrays.asList("Reflection","Collection","Stream");
// demonstration of filter method
List result = names.stream().filter(s->s.startsWith("S")).
collect(Collectors.toList());
System.out.println(result);
// demonstration of sorted method
List show =
names.stream().sorted().collect(Collectors.toList());
System.out.println(show);
// create a list of integers
List numbers = Arrays.asList(2,3,4,5,2);
// collect method returns a set
Set squareSet =
numbers.stream().map(x->x*x).collect(Collectors.toSet());
System.out.println(squareSet);
// demonstration of forEach method
number.stream().map(x->x*x).forEach(y->System.out.println(y));
// demonstration of reduce method
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
要点/观察:
- 流由源和组合在一起的零个或多个中间方法(流水线)和一个终端方法组成,以按照所述方法处理从源获得的对象。
- Stream 用于根据流水线方法计算元素,而不改变对象的原始值。