作为 Java 开发者,我们还没有完全掌握 Java Streams 这个多功能工具的威力。在这里,你将发现一些有价值的技巧,可以作为参考并应用到你的下一个项目中。
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.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 可以实现应用从创建、配置、开发、测试到发布、运维、升级等完整生命周期的管理。减少了传统应用程序的代码编写量,通过图形化、可视化的界面,以拖放组件的方式,即可快速生成应用程序的产品,大幅降低了开发企业管理类软件的难度。
感谢阅读本文,如果有什么建议,请在评论中让我知道。我很乐意改进。
评论