当前位置: 首页 > article >正文

java stream 实践篇

文章目录

  • List与Map转换
    • List<Object> 转换为类似为 Map<Integer, List<Object>>
    • List<Object> 转换为类似为 Map<Integer, Object>
    • List<Object> 转换为类似为 Map<属性1, 属性2>
  • List<对象>转List<属性>
    • 提取对象中单个属性的集合or去重
    • 按属性分组to Map
    • 过滤某个属性,返回一个值
  • List某字段求和/取平均等操作
  • 踩过的坑
    • foreach无序

经常用stream操作,但一段时间不用就会忘记,借此来写篇博客~

List与Map转换

List 转换为类似为 Map<Integer, List>

按某个属性进行分组

//定义
public class User {
    
    private String name;
    private Integer age;
    private Integer gender;
    
}

//伪代码
public static void main(String[] args) {
    
    List<User> list = getUserList();
    
    //提取名字相同的记录,拼接成map 
    Map<String, User> map = list.stream().collect(
        Collectors.groupingBy(User::getName));
    
}

List 转换为类似为 Map<Integer, Object>

//定义
public class User {
    
    private String name;
    private Integer age;
    private Integer gender;
    
}

//伪代码
public static void main(String[] args) {
    
    List<User> list = getUserList();
    
    //防止key值冲突
    Map<String, User> map = list.stream().collect(Collectors.toMap(
        e -> {
            return (e.getName() + "_" + e.getAge());
        }, Function.identity(), (key1, key2) -> key2)
    );
    
}

此处有两种写法:

  1. Collectors.toMap(User::getName, User -> User);
  2. Collectors.toMap(User::getName, Function.identity());

List 转换为类似为 Map<属性1, 属性2>

//定义
public class User {
    
    private String name;
    private Integer age;
    private Integer gender;
    
}

//伪代码
public static void main(String[] args) {
    
    List<User> list = getUserList();
    
    //两个属性值,一个为key,一个为value
    Map<String, Integer> map = list.stream().collect(
        Collectors.toMap(User::getName, User::getAge));
    
}

List<对象>转List<属性>

例子中用到的User实体类

//定义
public class User {
    
    private String name;
    private Integer age;
    private Integer gender;
    
}

提取对象中单个属性的集合or去重

如下案例,提取User对象集合中属性name集合

//伪代码
public static void main(String[] args) {
    
    List<User> list = getUserList();
    
    //提取name集合
    List<String> nameList = list.stream().map(User::getName).collect(Collectors.toList());
    //提取name集合并去重,distinct()
    List<String> nameList = list.stream().map(User::getName).distinct().collect(Collectors.toList());
    
}

按属性分组to Map

//伪代码
public static void main(String[] args) {
    
    List<User> list = getUserList();
    
    //提取name集合
    Map<String, List<User>> ageMap = list.stream().collect(
        Collectors.groupingBy(User::getAge));
    
}

过滤某个属性,返回一个值

举个栗子:从列表中获取年龄为16岁的某个用户姓名(随机)

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class TestService {
	
	public static void main(String[] args) {
		
		List<User> userList = new ArrayList<User>();
		User user1 = new User("lizzy", 18);
		userList.add(user1);
		User user2 = new User("小芳", 16);
		userList.add(user2);
		User user3 = new User("小花", 17);
		userList.add(user3);
		User user4 = new User("小玲", 19);
		userList.add(user4);
		User user5 = new User("小雨", 20);
		userList.add(user5);
		
		Optional<String> name = userList.stream().filter(user -> user.getAge() == 16).map(User::getName).findFirst();
		if (name.isPresent()) {
			System.out.println(String.format("年龄16岁的小姐姐芳名为:%s", name.get()));
		}
		
	}
	
}

List某字段求和/取平均等操作

IntSummaryStatistics、相应的还有DoubleSummaryStatistics, LongSummaryStatistics

public class SummaryStatistics {

    public static void main(String[] args) {
        //1.对int类型list进行求和
        List<User> list = new ArrayList<User>();
        list.add(new User('lizzy', 18));
        list.add(new User('huajuan', 28));

        IntSummaryStatistics summaryStatistics = list.stream().mapToInt((s) -> s.getAge).summaryStatistics();
        System.out.println("总和:" + summaryStatistics.getSum());
        System.out.println("平均数:" + summaryStatistics.getAverage());
        System.out.println("总个数:" + summaryStatistics.getCount());
        System.out.println("最大值:" + summaryStatistics.getMax());
        System.out.println("最小值:" + summaryStatistics.getMin());
    }
}

踩过的坑

foreach无序

java stream 有序_关于java:Stream.forEach是否遵循顺序流的遭遇顺序?

java foreach顺序_面试:Stream#foreach方法摸底三问,你都了解吗

需要在并行流中保证元素顺序消费需要使用java.util.stream.Stream#forEachOrdered





未完待续。。。

http://www.kler.cn/news/16613.html

相关文章:

  • day1_内存区域
  • 枚举法计算24点游戏
  • C++Primer第五版【阅读笔记】
  • LeetCode 560. 和为 K 的子数组
  • kettle不同数据源的字段不一致的合并后插入数据库
  • 如何使用快速排序算法对整数数组进行就地排序?
  • 从4k到42k,软件测试工程师的涨薪史,给我看哭了
  • 我的医学预测模型评价步骤(仅供参考)
  • SmartEngine流程引擎之Custom模式
  • ApplicationContextAware接口
  • ETL工具 - Kettle 输入输出算子介绍
  • MyBatisPlus代码生成器使用
  • Linux Ansible角色介绍
  • Python使用AI animegan2-pytorch制作属于你的漫画头像/风景图片
  • 3.3 泰勒公式例题分析
  • c++ 11标准模板(STL) std::vector (三)
  • 同时使用注解和 xml 的方式引用 dubbo 服务产生的异常问题排查实战
  • 抓马,互联网惊现AI鬼城:上万个AI发帖聊天,互相嗨聊,人类被禁言
  • ASIC-WORLD Verilog(6)运算符
  • 【.net core 自动生成数据库】
  • 认识Cookie和Session
  • 【算法】求最短路径算法
  • react之按钮鉴权
  • Java微服务商城高并发秒杀项目--013.SentinelResource的使用
  • 算法刷题|392.判断子序列、115.不同的子序列
  • 大型医院影像PACS系统三维重建技术(获取数据、预处理、配准、重建和可视化)
  • Stable Diffusion 本地部署教程不完全指南
  • 第18章 项目风险管理
  • javascript中的严格模式
  • 自动驾驶行业观察之2023上海车展-----车企发展趋势(1)