Stream流 API是java8版本中新增的特性,它为数据处理提供了像SQL一样的操作流程,对于数据的处理起到了很好的优化作用。
一、Stream入门介绍
1.流与集合有以下几种不同
- 没有存储。 流不是存储元素的数据结构; 相反,它通过计算操作的流水线传送诸如数据结构,阵列,生成器功能或I / O通道的源的元件。
- 功能性质。 流上的操作产生结果,但不会修改其来源。 例如,过滤从Stream获得的Stream会生成新的Stream而不需要过滤的元素,而不是从源集合中删除元素。
- 懒惰寻求。 许多流操作(如过滤,映射或重复删除)可以懒惰地实现,从而暴露优化的机会。 例如,“找到具有三个连续元音的第一个String ”不需要检查所有的输入字符串。 流操作分为中间( Stream生产)操作和终端(价值或副作用生成)操作。 中级操作总是懒惰。
- 可能无限。 虽然集合的大小有限,但流不需要。 诸如limit(n)或findFirst()之类的limit(n) findFirst()可以允许无限流上的计算在有限的时间内完成。
消耗品 流的元素只能在流的一生中访问一次。 像Iterator一样 ,必须生成一个新流来重新访问源的相同元素。
2.流可以通过多种方式获得。 - 从Collection通过stream()和parallelStream()方法;
- 从阵列通过Arrays.stream(Object[]) ;
- 从上流类静态工厂的方法,如Stream.of(Object[]) , IntStream.range(int, int)或Stream.iterate(Object, UnaryOperator) ;
- 文件的行可以从BufferedReader.lines()获取 ;
- 文件路径的流可以从Files中的方法获得;
- 随机数流可以从Random.ints()获得;
二.实战总结
package com.cn.test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import com.cn.bean.UserInfo;
/**
* java8 新API stream 流
*
* 流的使用
* 1. 创建流(List、Arrays) 2. 中间操作(filter、map、distinct(去重)、sorted(排序)) 3.结束操作(forEach)
* 特性:
* 1. stream 有‘惰性求值’机制,在没有结束操作时中间操作是不会执行的
* 2. 使用stream流的时候,对操作的源数据是没有影响的
* 3. 集合List生成流 List对象.stream 数组生成流 Arrays.stream(数组对象)
*/
public class StreamAPITest {
/**
* 创建用户数据列表
* @return
*/
private static List<UserInfo> createUser() {
// List<UserInfo> userInfos = new ArrayList<UserInfo>();
// userInfos.add(new UserInfo("1001","wang",10));
// userInfos.add(new UserInfo("1002","wang2",11));
// userInfos.add(new UserInfo("1003","wang3",12));
// userInfos.add(new UserInfo("1004","wang4",13));
// userInfos.add(new UserInfo("1005","wang5",14));
List<UserInfo> userInfos = Arrays.asList(
new UserInfo("1001","wang",10),
new UserInfo("1001","wang",10),
new UserInfo("1004","wang4",13),
new UserInfo("1004","wang4",13),
new UserInfo("1004","wang4",13),
new UserInfo("1004","wang4",13));
return userInfos;
}
public static void main(String[] args) {
/**
* 1. 创建 2. 过滤 3.结束操作
*/
List<UserInfo> userInfos = createUser();
// userInfos.stream()
// .filter((e) -> e.getUserAge() >= 12)
// .forEach(System.out::println);
//
/**
* 1. 创建 2. 映射 3.结束操作
*/
Integer[] integers = new Integer[] {
1,2,3,4};
// Arrays.stream(integers)
// .map((x) -> x*x)
// .forEach(System.out:: println);
/**
* reduce 求值
*/
// Optional<Integer> countOptional = userInfos.stream()
// .map((e) -> 1)
// .reduce(Integer :: sum);
// System.out.println(countOptional.get());
/**
* 去重 (年龄去重)
*/
userInfos.stream()
.map((t) -> t.getUserAge())
.distinct()
.forEach(System.out::println);
}
}