JAVA流式计算
流的简单介绍
Java 8 中,引入了流(Stream)的概念,利用提供的Stream API,我们可以方便的操作集合数据,这种方式很类似于使用SQL对数据库的操作。
如何生成流
利用Stream API,首先我们需要生成流,以下是生成流的常用方式(这里我们只介绍顺序流):
1、所有继承自Collection的接口都可以直接转化为流:
List l1 = Arrays.asList(1, 2, 3, 4, 5);
Stream stream = l1.stream();
Map s1 = new HashMap<>();
Stream> stream1 = s1.entrySet().stream();
2、利用Arrays类中的stream()方法:
Integer[] i1 = new Integer[]{1,2,3,4,5};
Stream stream = Arrays.stream(i1);
3、使用Stream类中的静态方法:
Stream stream = Stream.of(1,2,3,4,5);
4、利用BufferedReader读取文本中的内容转化为流:
BufferedReader reader = new BufferedReader(new FileReader("D:\\stream.txt"));
Stream stream = reader.lines();
我们经常使用的还是方式1,将集合转化为流。
如何操作流
流的主要操作有筛选/切片/查找/匹配/映射/归约
操作流的方法简介
操作流的方法分为两类,一类是惰性求值,一类是及早求值;
惰性求值并不是立刻执行的,而是将求值的过程记录下,在进行及早求值的时候,才会按顺序执行前面的惰性求值,一般的执行过程如下:
Stream.惰性求值.惰性求值. ... .惰性求值.及早求值
区分是惰性求值还是及早求值,可以通过方法的返回值来判断,返回值时Stream类型的就是惰性求值
在介绍如何通过Stream API对流进行操作前,我们首先了解下函数式接口的相关知识(后面介绍的Stream API中会使用到这些函数式接口),这里只作简单介绍。
函数式接口
所谓函数式接口,是指只含有一个抽象方法的接口,一般加@FunctionalInterface注解加以标注,函数式接口可以被隐式地转化为Lamada表达式;
这里我们主要介绍了java.util.function包下的四个常用的函数式接口:
接口
方法
简介
Consumer
void accept(T t)
消费接口,接收一个T类型的对象
Supplier
T get()
供给接口,返回一个T类型的对象
Function
R apply(T t)
映射接口,接收一个T类类型的对象转换为R类型的对象
Predicate