Java8 Stream流如何操作集合,一文带你了解!
迪丽瓦拉
2024-03-21 06:07:58
0

Java8 Stream流如何操作集合,一文带你了解!

  • 一、基本介绍
  • 二、常用集合操作
  • 三、操作符
    • 3.1 中间操作符
    • 3.2 终止操作符

一、基本介绍

  • 概念:Stream是Java8 API的新成员,它允许以声明性的方式处理数据集合。
  • 特点:1.代码简明:函数式编程写出的代码简洁且意图明确,是用stream接口让你从此告别for循环。2.多核友好:Java函数式编程使得编写并运行程序更简单,需要的都是调用方法
  • 流程:1.把集合转换为stream 2.操作stream:stream流在管道中经过中间操作符的处理,最后由最终操作得到前面处理的结果

二、常用集合操作

-- 取出集合中对象的指定值-不去重
List ageList=userList.stream().map(User::getAge).collect(Collectors.toList());
-- 取出集合中对象的指定值-并去重
List ageDistinct=userList.stream().map(User::getAge).collect(Collectors.toList())
.stream().distinct().collect(Collectors.toList());
-- 取出对象中字段等于指定值的 数据
List age12List=userList.stream().filter(user ->user.getAge().equals("12")).collect(Collectors.toList());
-- 以对象中的指定值分组
Map> ageMap=userList.stream().collect(Collectors.groupingBy(User::getAge));
-- 以指定字段排序
List sortAscUserList = userList.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());
List sortDescUserList = userList.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList());
-- 取出对象指定字段的最大值
int maxAge = userList.stream().mapToInt(user -> Integer.valueOf(user.getAge())).max().getAsInt();
-- List集合中Map对象
List> userList=new ArrayList<>();
Map user1=new HashMap<>();
user1.put("name","A");user1.put("age","12");userList.add(user1);
Map user2=new HashMap<>();
user2.put("name","B");user2.put("age","13");userList.add(user2);
Map user3=new HashMap<>();
user3.put("name","B");user3.put("age","12");userList.add(user3);List ageList=userList.stream().map(user->user.get("age")).collect(Collectors.toList());

三、操作符

Java Stream的操作符可以分为中间操作符终止操作符两种

3.1 中间操作符

流方法含义
filter用于通过设置的条件过滤元素
distinct返回一个元素各异(根据元素流所生成元素的hashCode()和equals方法实现)的流
limit返回一个不超过指定长度的流
skip返回一个扔掉前n个元素的流
sort返回排序后的流
map返回由给定函数应用于此流的元素的结果组成的流
-- filter 
List list= Arrays.asList("abc","ab","","","fg",null);
List notNullList = list.stream().filter(str -> StringUtils.isNotBlank(str)).collect(Collectors.toList());
System.out.println(notNullList);
--输出[abc, ab, fg]List containsList = list.stream().filter(str -> StringUtils.isNotBlank(str) && str.contains("a")).collect(Collectors.toList());
System.out.println(containsList);
--输出[abc, ab]
-- distinct
List list= Arrays.asList("abc","ab","ab");
List distinctList = list.stream().distinct().collect(Collectors.toList());
System.out.println(distinctList);
--输出[abc, ab]
-- limit
List list= Arrays.asList("abc","ab","ab");
List limitList = list.stream().limit(2).collect(Collectors.toList());
System.out.println(limitList);
--输出[abc, ab]
-- skip
List list= Arrays.asList("abc","ab","ab");
List limitList = list.stream().skip(2).collect(Collectors.toList());
System.out.println(limitList);
-- 输出 [ab]
-- sort
List list= Arrays.asList("1","3","2");
List sortList = list.stream().sorted().collect(Collectors.toList());
System.out.println(sortList);
--输出[1, 2, 3]
-- map
List list= Arrays.asList("abc","ab","ab");
List mapList = list.stream().map(str->"case_"+str).collect(Collectors.toList());
System.out.println(mapList);
--输出[case_abc, case_ab, case_ab]

3.2 终止操作符

流方法含义
anyMatch集合中是否有一个元素满足条件
allMatch集合中元素是否都满足条件
noneMatch集合中元素是否都不满足条件
findFirst返回流的第一个对象的Optional
collect收集器 将流转换为其他形式
count返回流元素个数
-- anyMatch
List list= Arrays.asList("abc","ab","","","fg",null);
boolean flag = list.stream().anyMatch(str -> str == null);
System.out.println(flag);
-- 输出 true
-- allMatch
List list= Arrays.asList("abc","ab","","","fg");
System.out.println(list.stream().allMatch(str -> str != null));
-- 输出 true
-- noneMatch
List list= Arrays.asList("abc","ab","","","fg");
System.out.println(list.stream().noneMatch(str -> str == null));
-- 输出 true
-- findFirst
List list= Arrays.asList("abc","ab","","","fg");
System.out.println(list.stream().findFirst().get());
-- 输出 abc
-- collect
List list= Arrays.asList("abc","ab","","","fg");
List collectList = list.stream().collect(Collectors.toList());
System.out.println(collectList);
-- 输出 [abc, ab, , , fg]
-- count
List list= Arrays.asList("abc","ab","","","fg");
System.out.println(list.stream().count());
-- 输出5
System.out.println(list.stream().filter(str-> StringUtils.isNotBlank(str)).count());
-- 输出3

相关内容