Java 8 - Stream

什么是Stream

Stream 是对 Collection 功能的增强,它专注于对集合进行各种便利高效的聚合操作(aggregate operation),或者大批量数据操作(bulk data operation)。

Stream 就像一个高级版本的Iterator,用户指明想要进行的操作,它会在内部隐式地遍历,做出相应的数据转换。

Stream特性

  1. stream不存储数据
  2. stream不改变源数据
  3. stream的延迟执行特性

Stream特点

Stream的构成

一般使用Stream的时候,有三个步骤:

每次转换完成后,返回一个新的Stream对象,可以对其继续进行其他转换。这就允许Stream操作可以像链条一样排列,变成一个管道。

Stream的数据源

Collections, Arrays, or I/O resources

构造流的几种常见方法

// 1. Individual values
Stream stream1 = Stream.of("a", "b", "c");
// 2. Arrays
String [] strArray = new String[] {"a", "b", "c"};
Stream stream2 = Stream.of(strArray);
Stream stream3 = Arrays.stream(strArray);
// 3. Collections
List<String> list = Arrays.asList(strArray);
Stream stream4 = list.stream();

流转换为其它数据结构

// 1. Array
String[] strArray1 = stream.toArray(String[]::new);
// 2. Collection
List<String> list1 = stream.collect(Collectors.toList());
List<String> list2 = stream.collect(Collectors.toCollection(ArrayList::new));
Set set1 = stream.collect(Collectors.toSet());
Stack stack1 = stream.collect(Collectors.toCollection(Stack::new));
// 3. String
String str = stream.collect(Collectors.joining()).toString();

Stream的操作

流的操作类型分为两种:中间操作,结束操作。

常见用例

所有的单词转换为大写

List<String> output = wordList.stream()
	.map(String::toUpperCase)
	.collect(Collectors.toList());

过滤数组,只留下偶数

Integer[] sixNums = {1, 2, 3, 4, 5, 6};
Integer[] evens = Stream.of(sixNums)
	.filter(n -> n%2 == 0)
	.toArray(Integer[]::new);

对一个人员集合遍历,找出男性并打印姓名

roster.stream()
 .filter(p -> p.getGender() == Person.Sex.MALE)
 .forEach(p -> System.out.println(p.getName()));

找出最长一行的长度

BufferedReader br = new BufferedReader(new FileReader("c:\\SUService.log"));
int longest = br.lines()
	.mapToInt(String::length)
	.max()
	.getAsInt();
br.close();
System.out.println(longest);

Reference

Fork me on GitHub