Java8新特性五:Stream API

文章目录
  1. 1. Stream概念
    1. 1.1. Java Stream的特性
  2. 2. 生成Stream
  3. 3. 在Stream上进行操作
    1. 3.1. 中间操作(intermediate operation)
    2. 3.2. 最终操作(terminal operation)
  4. 4. Stream示例

Stream概念

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

Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

Java Stream的特性

  • Stream不是一种数据结构,而是一个来自数据源的元素队列并支持聚合操作
  • Stream不会改变来源的数据结构
  • 每个中间操作都是延迟执行的,并返回一个流,元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果

以上的流程转换成Java代码为:

1
2
3
4
5
6
List<Integer> transactionsIds = 
widgets.stream()
.filter(b -> b.getColor() == RED)
.sorted((x,y) -> x.getWeight() - y.getWeight())
.mapToInt(Widget::getWeight)
.sum();

生成Stream

在java 8中, 集合接口有两个方法来生成流:

  1. stream() − 为集合创建串行流。
1
2
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
  1. parallelStream() − 为集合创建并行流。
1
2
3
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
int count = strings.parallelStream().filter(string -> string.isEmpty()).count();

在Stream上进行操作

中间操作(intermediate operation)

  1. map: map 方法用于映射每个元素到对应的结果
1
2
List number = Arrays.asList(2,3,4,5);
List square = number.stream().map(x->x*x).collect(Collectors.toList());
  1. filter: filter 方法用于通过设置的条件过滤出元素
1
2
List names = Arrays.asList("Reflection","Collection","Stream");
List result = names.stream().filter(s->s.startsWith("S")).collect(Collectors.toList());
  1. sorted: sorted 方法用于对流进行排序
1
2
List names = Arrays.asList("Reflection","Collection","Stream");
List result = names.stream().sorted().collect(Collectors.toList());
  1. limit:limit 方法用于获取指定数量的流
1
2
Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

最终操作(terminal operation)

  1. collect: collect方法用于返回执行中间操作后的结果
1
2
List number = Arrays.asList(2,3,4,5,3);
Set square = number.stream().map(x->x*x).collect(Collectors.toSet());
  1. forEach:forEach 方法用来迭代流中的每个数据
1
2
Random random = new Random();
random.ints().limit(10).forEach(System.out::println);
  1. reduce: reduce方法用于将流的元素计算后输出一个值
1
2
3
4
//reduce方法将BinaryOperator用作参数
//在这里,ans变量初始值为0
List number = Arrays.asList(2,3,4,5);
int even = number.stream().filter(x->x%2==0).reduce(0,(ans,i)-> ans+i);

Stream示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//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<Integer> number = Arrays.asList(2,3,4,5);

// demonstration of map method
List<Integer> square = number.stream().map(x -> x*x).collect(Collectors.toList());

System.out.println(square);

// create a list of String
List<String> names = Arrays.asList("Reflection","Collection","Stream");

// demonstration of filter method
List<String> result = names.stream().filter(s->s.startsWith("S")).
collect(Collectors.toList());
System.out.println(result);

// demonstration of sorted method
List<String> show = names.stream().sorted().collect(Collectors.toList());

System.out.println(show);

// create a list of integers
List<Integer> numbers = Arrays.asList(2,3,4,5,2);

// collect method returns a set
Set<Integer> 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);
}
}

输出:

1
2
3
4
5
6
7
8
9
[4, 9, 16, 25]
[Stream]
[Collection, Reflection, Stream]
[16, 4, 9, 25]
4
9
16
25
6