Java 8中新增了Stream,主要是lambda表达式的应用,其链式调用简洁,用于高效表达集合操作。
先对Stream的使用做了解,参照blog。
(1) 生成Stream的方式
主要有以下几种
1. 数组 - Array
String[] arr = {"gh","shf","awuygwi"};
Stream.of(arr).forEach(System.out::println);
Arrays.stream(arr).forEach(System.out::println);
2. 集合 - Collection
List<String> list = Arrays.asList(arr);
list.stream().forEach(System.out::println);
Stream.of(list).forEach(System.out::println);
3. 文件io
String filePath = "xxx"; try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { reader.lines().forEach(System.out::println); } catch (IOException e) { e.printStackTrace(); }
(2) Stream的操作分Intermediate, Terminal和short-circuiting
1. Intermediate操作
构成链式调用的部分,做过滤/映射等。该类型操作不会立即对元素作用,直到Terminal操作开始起作用。
常见的比如,filter(), map()/flatMap(), sorted(), limit()
2. Terminal操作
Terminal操作生成最终结果。一个Stream对应一个Terminal操作。
常见的比如,forEach(), collect(), min(), max(), count(), findFirst()
3. short-circuiting操作
short-circuiting常用于操作无限Stream,比如allMatch(), findFirst(), limit()
以下是使用Stream的一个例子,
filter,mapToInt 为Intermediate操作;sum为Terminal操作
int sum = widgets.stream().filter(w -> w.getColor() == RED).mapToInt(w -> w.getWeight()).sum();
(3) Stream典型用法
参照blog,实践中...