写点什么

Java 流式编程的七个必学技巧

作者:高端章鱼哥
  • 2024-08-22
    福建
  • 本文字数:2025 字

    阅读完需:约 7 分钟

Java 流式编程的七个必学技巧

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

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

在下面的示例中,我们将使用以下类。



复制

@Getterclass Company {  private String name;  private Address address;  private List personList;}
@Getterclass Person { private Long id; private String name;}
@Getterclass Address { private String street; private City city;}
@Getterclass City { private String name; private State state;}
@Getterclass State{ private String name;}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.
复制代码

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

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

复制

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

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

复制

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

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();}1.2.3.4.5.6.7.8.9.10.
复制代码

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;}1.2.3.4.5.6.7.8.9.10.11.12.
复制代码

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

复制

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

4. 按属性分组

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

复制

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

5. 检查流中是否有项目

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

复制

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

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

复制

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

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();}1.2.3.4.5.6.7.8.
复制代码

7. 获取唯一的城市名称

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

复制

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

总结

以上就是通过实例展示的 7 个技巧,希望对你有所帮助。作为开发者,我们需要保持好奇心和学习热情,不断探索新的技术,只有这样,我们才能在这个快速发展的时代中立于不败之地。介绍一款程序员都应该知道的软件 JNPF 快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。

JNPF 可以实现应用从创建、配置、开发、测试到发布、运维、升级等完整生命周期的管理。减少了传统应用程序的代码编写量,通过图形化、可视化的界面,以拖放组件的方式,即可快速生成应用程序的产品,大幅降低了开发企业管理类软件的难度。

感谢阅读本文,如果有什么建议,请在评论中让我知道。我很乐意改进。

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
Java 流式编程的七个必学技巧_高端章鱼哥_InfoQ写作社区