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

Posted One Tester

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java8 Stream流如何操作集合,一文带你了解!相关的知识,希望对你有一定的参考价值。

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

以上是关于Java8 Stream流如何操作集合,一文带你了解!的主要内容,如果未能解决你的问题,请参考以下文章

一文带你入门Java Stream流,太强了

一文带你了解Java8之Stream

一文带你了解Java8之Stream

一文带你了解Java8之Stream

JAVA8新特性--集合流操作Stream

Java8新特性--Stream流操作