Java SE 8 的流库
java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。> Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。
java.util.stream能做什么
- Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)
- java.util.stream 是一个函数式语言+多核时代综合影响的产物
- 结合Lambda 表达式,极大的提高编程效率和程序可读性
Stream 对集合操作
流表面上看起来和集合很类似,都可以让我们转换和获取数据。但它们之间存在着显著的差异:
- 流并不存储其元素。
- 流的操作不会修改其数据源。
- 流的操作是尽可能惰性执行的。
List集合
alice.txt在CountLongWords.java文件包名所写的根目录
public class CountLongWords {
public static void main(String[] args) {
List<String> words = null;
String contents = null;
try {
contents = new String(Files.readAllBytes(Paths.get("alice.txt")), StandardCharsets.UTF_8);
words = Arrays.asList(contents.split("\\PL+"));
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(contents);
System.out.println(words);
long count = 0;
for (String w : words) {
if (w.length() > 4)
count++;
}
System.out.println("1、alice.txt " + count);
count = words.stream().filter(w -> w.length() > 4).count(); //为集合创建串行流。
System.out.println("2、alice.txt " + count);
count = words.parallelStream().filter(w -> w.length() > 4).count(); //为集合创建并行流。
System.out.println("3、alice.txt " + count);
}
}
数组处理
不像集合直接调用,需要先转换成stream
基本类型流有专门的类型:IntStream、LongStream、DoubleStream
注意:区别对象数组和一般数组,
public class StreamTester {
public static void main(String[] args) {
Integer[] sixNums = { 1, 2, 3, 4, 5, 6 };
Integer[] evens = Stream.of(sixNums).filter(n -> n % 2 == 0).toArray(Integer[]::new);
Stream.of(evens).forEach(System.out::println);
int[] nums = { 1, 2, 3, 4, 5, 6 };
Stream.of(nums).forEach(System.out::println);
IntStream.of(nums).forEach(System.out::println);
}
}
Stream相关函数
相关文档
Java 8 中的 Streams API 详解
Package java.util.stream
Java8学习之Stream(流)
Java 8中Stream API的这些奇技淫巧!你都Get到了吗?
简洁又快速地处理集合——Java8 Stream(上)
简洁又快速地处理集合——Java8 Stream(下)