首页 > 编程语言 >Java 流式编程详解,Demo案例解析

Java 流式编程详解,Demo案例解析

时间:2024-07-03 13:55:59浏览次数:17  
标签:map Java stream Demo List 流式 return public companyList

Java 流式编程详解,Demo案例解析

Java Streams在很多年前就被引入了,但作为Java开发者,我们还没有完全掌握这个多功能工具的威力。在这里,你将发现一些有价值的技巧,可以作为参考并应用到你的下一个项目中。

在下面的示例中,我们将使用以下类。
在这里插入图片描述

@Getter
class Company {
  private String name;
  private Address address;
  private List personList;
}

@Getter
class Person {
  private Long id;
  private String name;
}

@Getter
class Address {
  private String street;
  private City city;
}

@Getter
class City {
  private String name;
  private State state;
}

@Getter
class State{
  private String name;
}

1.使用方法引用简化地图

以下代码可获取公司地址的城市名称。

public List getCityNames(List companyList){
  return companyList.stream()
    .map(company -> company.getAddress().getCity().getName())
    .toList();
}

可以替换为以下更具可读性的版本。

public List getCityNames(List companyList){
  return companyList.stream()
    .map(Company::getAddress)
    .map(Address::getCity)
    .map(City::getName)
    .toList();
}

2.空值检查

上述代码加上空值检查。

public List getCityNames(List companyList){
  return companyList.stream()
    .map(Company::getAddress)
    .filter(Objects::nonNull)
    .map(Address::getCity)
    .filter(Objects::nonNull)
    .map(City::getName)
    .filter(Objects::nonNull)
    .toList();
}

3.从流的流到流

以下代码获取所有公司的人员名单列表。

public List getAllPerson(List companyList){
  // 生成一个Person列表的列表
  List> partialResult = companyList.stream()
    .map(Company::getPersonList)
    .toList();

  // 将每个Person列表添加到结果中
  List result = new ArrayList<>();
  partialResult.forEach(result::addAll);

  return result;
}

可以用以下方式实现相同的功能。

public List getAllPerson(List companyList){
  return companyList.stream()
    .map(Company::getPersonList) // 返回一个Stream>
    .flatMap(List::stream)  // 返回一个Stream
    .toList(

4.按属性分组

以下代码将返回一张地图,其中包含每个城市的公司列表。

public Map> getCompaniesByCity(List companyList){
  return companyList.stream()
    .collect(Collectors.groupingBy(company -> company.getAddress().getCity()));
}

5.检查流中是否有项目

以下代码会检查是否有公司在某个城市。

public boolean hasCompanyInCity(List companyList, String cityName){
  return companyList.stream()
    .map(Company::getAddress)
    .map(Address::getName)
    .anyMatch(cityName::equals);
}

同样的方法也适用于noneMatch,如果你想检查某个城市是否有公司。

public boolean hasNoCompanyInCity(List companyList, String cityName){
  return companyList.stream()
    .map(Company::getAddress)
    .map(Address::getName)
    .noneMatch(cityName::equals);
}

6.记录日志

使用peek方法为每个返回的城市名记录日志。

public List getCityNames(List companyList){
  return companyList.stream()
    .map(Company::getAddress)
    .map(Address::getCity)
    .map(City::getName)
    .peek(cityName -> log.info(cityName))
    .toList();
}

7.获取唯一的城市名称

使用distinct从流中移除重复的城市名称。

public List getUniqueCityNames(List companyList){
  return companyList.stream()
    .map(Company::getAddress)
    .map(Address::getCity)
    .map(City::getName)
    .distinct()
    .toList();
}

以上就是通过实例展示的7个技巧,希望对你有所帮助。

来源:Java学研大本营

标签:map,Java,stream,Demo,List,流式,return,public,companyList
From: https://blog.csdn.net/weixin_44479706/article/details/140150005

相关文章

  • 基于Java的宠物领养管理系统
    目录        一、系统简介1.需求分析2 .编程环境与工具二、系统总体设计1.系统的功能模块图2.系统架构3.系统部署和测试步骤4.各功能模块简介(1)主页:(2)宠物知识:(3)领养中心:(4)团队博客:(5)团队展示:(6)注册/登录:三、主要业......
  • 【Java完整版 面试必备】Leetcode Top100题目和答案-矩阵篇
    目录以下摘自leetcodeTop100精选题目-矩阵篇​矩阵置零螺旋矩阵旋转图像搜索二维矩阵II以下摘自leetcodeTop100精选题目-矩阵篇矩阵置零给定一个 mxn 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。示例:输入:matrix......
  • JAVA妇产科专科电子病历系统源码,前端框架:Vue,ElementUI
    JAVA妇产科专科电子病历系统源码,前端框架:Vue,ElementUI孕产妇健康管理信息管理系统是一种将孕产妇健康管理信息进行集中管理和存储的系统。通过建立该系统,有助于提高孕产妇健康管理的效率和质量,减少医疗事故发生的可能性,管理医疗资源,保证孕产妇得到及时、准确的医疗服务。该系......
  • java的常用技术
    1、java集合(Iterable、List、Set、Map,JUC安全性集合)2、hashmap(原理,延申)、ConcurrentHashMap(锁:1.8是synchronized+node,1.7是segment)3、乐观锁(比较/交换)AtomicInteger是Java中的一个原子类4、悲观锁synchronized5、线程池运行状态运行过程其他......
  • 鸿蒙手机号&&验证码登录, 包含倒计时&&号码格式验证码格式校验, 还有 使用 Hyperlink
    1,先看看整体效果                          2,看格式校验效果                            3,代码直接CV  importpromptActionfrom'@ohos.promptA......
  • Java中semaphore的具体解释产生原因和使用场景
    Semaphore(信号量)信号量(Semaphore)是一种用于控制多个线程对共享资源访问的同步机制。它实质上是一个计数器,可以用来限制能够访问某些资源的线程数量。信号量可以是二进制的(只允许一个线程访问)或计数的(允许多个线程访问,具体数目由信号量的值决定)。信号量产生的原因信号量最......
  • Java基础——常用类库
    在Java编程的世界里,掌握并熟练使用类库是提高开发效率和代码质量的关键。本文将深入探讨几个常用的Java类库,包括它们的功能、应用场景以及如何有效利用它们来优化你的项目。1. CollectionsFramework简介:Java的集合框架(CollectionsFramework)提供了实现数据结构如列表、集......
  • Java基础——线程
    在当今的软件开发中,多线程技术是提升程序性能、实现并发处理的关键所在。Java作为一款广泛应用的编程语言,其内置的多线程支持为开发者提供了强大的工具箱。本文将深入探讨Java中的线程概念,包括线程的创建、生命周期、同步机制以及一些常见的问题和解决方案。1.线程的基本概念......
  • Java基础——日期操作类
    在Java中,处理日期和时间一直是一个复杂但又至关重要的任务。从早期的java.util.Date和java.util.Calendar,到Java8引入的java.time包,我们见证了日期和时间API的显著改进。本文将带你深入了解这些变化,并重点介绍如何使用java.time包中的类进行高效、准确的日期操作。1.回顾过......
  • 前端视角下的Go语法学习:demo-crud 实现增删改查
    今日话题基于go+gin实现增删改查,仅仅只是提供接口不涉及数据库增删改查作者:云层上的光时间:2024年6月22日10时15分14秒主线任务一、项目创建1、创建demo-crud文件夹2、编辑器打开demo-crud项目,提示设置gosdk,这里我设置了1.22.43、声明go.mod文件go......