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

一、基本介绍

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

二、常用集合操作

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

List<String> 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<String> list= Arrays.asList("abc","ab","","","fg",null);
List<String> notNullList = list.stream().filter(str -> StringUtils.isNotBlank(str)).collect(Collectors.toList());
System.out.println(notNullList);
--输出[abc, ab, fg]

List<String> containsList = list.stream().filter(str -> StringUtils.isNotBlank(str) && str.contains("a")).collect(Collectors.toList());
System.out.println(containsList);
--输出[abc, ab]
-- distinct
List<String> list= Arrays.asList("abc","ab","ab");
List<String> distinctList = list.stream().distinct().collect(Collectors.toList());
System.out.println(distinctList);
--输出[abc, ab]
-- limit
List<String> list= Arrays.asList("abc","ab","ab");
List<String> limitList = list.stream().limit(2).collect(Collectors.toList());
System.out.println(limitList);
--输出[abc, ab]
-- skip
List<String> list= Arrays.asList("abc","ab","ab");
List<String> limitList = list.stream().skip(2).collect(Collectors.toList());
System.out.println(limitList);
-- 输出 [ab]
-- sort
List<String> list= Arrays.asList("1","3","2");
List<String> sortList = list.stream().sorted().collect(Collectors.toList());
System.out.println(sortList);
--输出[1, 2, 3]
-- map
List<String> list= Arrays.asList("abc","ab","ab");
List<String> 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<String> list= Arrays.asList("abc","ab","","","fg",null);
boolean flag = list.stream().anyMatch(str -> str == null);
System.out.println(flag);
-- 输出 true
-- allMatch
List<String> list= Arrays.asList("abc","ab","","","fg");
System.out.println(list.stream().allMatch(str -> str != null));
-- 输出 true
-- noneMatch
List<String> list= Arrays.asList("abc","ab","","","fg");
System.out.println(list.stream().noneMatch(str -> str == null));
-- 输出 true
-- findFirst
List<String> list= Arrays.asList("abc","ab","","","fg");
System.out.println(list.stream().findFirst().get());
-- 输出 abc
-- collect
List<String> list= Arrays.asList("abc","ab","","","fg");
List<String> collectList = list.stream().collect(Collectors.toList());
System.out.println(collectList);
-- 输出 [abc, ab, , , fg]
-- count
List<String> 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
处理两个相关的List对象,并执行分组和统计操作,是函数式编程中的常见问题。要高效解决这一问题,可以利用Java 8Stream API。以下是一个示例,展示如何对两个List(例如Husband和Wife)进行操作,以及如何使用`groupingBy`和`mapToDouble`等方法进行分组和计数。 参考资源链接:[Java8高效处理双层List循环与集合操作实例](https://wenku.csdn.net/doc/6412b501be7fbd1778d419a2?spm=1055.2569.3001.10343) 首先,假设我们有两个List对象`husbandList`和`wifeList`,它们包含`Husband`和`Wife`对象,每个对象都有一个`familyId`属性。我们想要将它们组合成一个`Family`对象列表,当且仅当`husbandList`和`wifeList`中`familyId`相同的元素才能形成一个`Family`对象。 使用Stream API,我们可以将`husbandList`和`wifeList`的每个元素对应起来,然后过滤出那些`familyId`相同的元素对,最后将它们转换成`Family`对象。这可以通过以下代码实现: ```java List<Family> families = husbandList.stream() .flatMap(husband -> wifeList.stream() .filter(wife -> husband.getFamilyId() == wife.getFamilyId()) .map(wife -> new Family(husband, wife))) .collect(Collectors.toList()); ``` 接下来,如果我们想要对这些`Family`对象按照某个属性进行分组统计,比如按照`Family`对象的`numberOfChildren`属性分组,并计算每个分组的数量。我们可以使用`Collectors.groupingBy`方法: ```java Map<Integer, Long> familySizeCount = families.stream() .collect(Collectors.groupingBy(Family::getNumberOfChildren, Collectors.counting())); ``` 此外,如果我们需要计算每个分组的平均值,可以使用`Collectors.groupingBy`与`Collectors.averagingDouble`结合: ```java Map<Integer, Double> averageNumberOfChildren = families.stream() .collect(Collectors.groupingBy(Family::getNumberOfChildren, Collectors.averagingDouble(Family::getNumberOfChildren))); ``` 在这个例子中,`groupingBy`方法用于将中的元素分组,`counting()`和`averagingDouble()`方法则提供了统计功能。通过这种方式,我们可以高效地对两个相关列表进行复杂的操作和分析。 为了更深入地理解和掌握这些技术,建议参考《Java8高效处理双层List循环与集合操作实例》一文。该资源详细介绍了如何在Java8中利用Stream API来处理复杂的集合操作,并提供了实际的代码示例,有助于你理解在具体问题中如何应用这些高级API。 参考资源链接:[Java8高效处理双层List循环与集合操作实例](https://wenku.csdn.net/doc/6412b501be7fbd1778d419a2?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

One Tester

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值