1、Stream(流)介绍
Stream是一个来自数据源的元素队列并支持聚合操作,元素是特定类型的对象,形成一个队列。同时他不会储存元素,而是按照要求计算 ,可以简洁的对集合来进行数据的筛选、排序、提取等用途。
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
- 流的来源: 可以是集合,数组,I/O channel, 产生器generator 等。
- 聚合操作: 比如filter, map, reduce, find, match, sorted等。
2、Stream的使用
在 JDK8 中, 集合接口生成流:stream()【串行流】 parallelStream() 【并行流】
List<User> list = new ArrayList<User>();
List<User> users = list.stream()
.filter(p -> p.getUserId().equals("123"))
.limit(10)
.sorted()
.collect(Collectors.toList());
Stream :
filter :用于通过设置的条件过滤出元素
limit : 用于获取指定数量的流
sorted : 用于对流进行排序
collect : 实现了很多归约操作,例如将流转换成集合和聚合元素
Collectors.toList()
Collectors.toMap()
Collectors.toSet()
Stream 提供了 forEach 来迭代流中的每个数据
//打印所有数据
list.stream().forEach(System.out::println);
通过forEach,我们可以通过该方法来提取集合中泛型的某一个属性
List<User> list = new ArrayList();
List<String> str = new ArrayList<String>();
list.stream().forEach(p->{
str.add(p.getUserId());
});
还有简单方式进行属性的提取
① List<String> userIds =list.stream().map(u -> u.getUserId()).collect(Collectors.toList());
② List<String> userIds = list.stream().map(User::getUserId).collect(Collectors.toList());
进行求和、最大值、最小值、平均值
List<Integer> list = new ArrayList<Integer>();
IntSummaryStatistics collect = list.stream().collect(Collectors.summarizingInt(value -> value));
System.out.println(collect);
System.out.println("集合元素个数:" + collect.getCount());
System.out.println("总和:" + collect.getSum());
System.out.println("最小值:" + collect.getMax());
System.out.println("最大值:" + collect.getMin());
System.out.println("平均值:" + collect.getAverage());
List<Map<String,Object>>类型数据,想提取集合中某一key值的数据集合
List<Map<String, Object>> listMap = new ArrayList<Map<String, Object>>();
Optional<Map<String, Object>> any = listMap.stream().findAny();
//isPresent() 与 obj != null 一致,没有区别
if(any.isPresent()){
str.add(any.get().get("key").toString());
}
Optional也是JDK8的新特性,是Java8为了解决null值判断问题,借鉴google guava类库的Optional类而引入的一个同名Optional类,避免导致空指针。
get()方法主要用于返回包装对象的实际值,但是如果包装对象值为null,会抛出NoSuchElementException异常。
isPresent()方法用于判断包装对象的值是否非空。
1、转JSONArray对象,collect(Collectors.toCollection(JSONArray::new));