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;}
以下代码可获取公司地址的城市名称。
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();}
上述代码加上空值检查。
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();}
以下代码获取所有公司的人员名单列表。
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(
以下代码将返回一张地图,其中包含每个城市的公司列表。
public Map> getCompaniesByCity(List companyList){ return companyList.stream() .collect(Collectors.groupingBy(company -> company.getAddress().getCity()));}
以下代码会检查是否有公司在某个城市。
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);}
使用peek方法为每个返回的城市名记录日志。
public List getCityNames(List companyList){ return companyList.stream() .map(Company::getAddress) .map(Address::getCity) .map(City::getName) .peek(cityName -> log.info(cityName)) .toList();}
使用distinct从流中移除重复的城市名称。
public List getUniqueCityNames(List companyList){ return companyList.stream() .map(Company::getAddress) .map(Address::getCity) .map(City::getName) .distinct() .toList();}
以上就是通过实例展示的7个技巧,希望对你有所帮助。
本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-96419-0.htmlJava 流式编程的七个必学技巧
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com