作为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. 使用方法引用简化地图
以下代码可获取公司地址的城市名称。
复制
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个技巧,希望对你有所帮助。
作为开发者,我们需要保持好奇心和学习热情,不断探索新的技术,只有这样,我们才能在这个快速发展的时代中立于不败之地。介绍一款程序员都应该知道的软件JNPF快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。
JNPF可以实现应用从创建、配置、开发、测试到发布、运维、升级等完整生命周期的管理。减少了传统应用程序的代码编写量,通过图形化、可视化的界面,以拖放组件的方式,即可快速生成应用程序的产品,大幅降低了开发企业管理类软件的难度。
当然,我更建议大家成为一个全栈,不要把自己的定位局限于前端。
感谢阅读本文
如果有什么建议,请在评论中让我知道。我很乐意改进。