天天看点

记JDK8中,Stream 使用

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));