java - 如何组合类似的方法?
问题描述
我有完全相同的方法,但是针对不同的领域。根据参数,我怎样才能创建一个可以同时做这两件事的方法。
提前致谢。
private int getLengthOfLongestName(List<Driver> drivers) {
return drivers.stream()
.map(t -> t.getName())
.max(Comparator.comparingInt(String::length))
.map(String::length)
.orElse(0);
}
private int getLengthOfLongestTeam(List<Driver> drivers) {
return drivers.stream()
.map(t -> t.getTeamName())
.max(Comparator.comparingInt(String::length))
.map(String::length)
.orElse(0);
}
解决方案
以 aFunction
作为参数:
private int getLengthOfLongest(List<Driver> drivers, Function<Driver, String> func) {
return drivers.stream()
.map(func)
.mapToInt(String::length)
.max()
.orElse(0);
}
然后您可以将其称为getLengthOfLongest(driverList, Driver::getName)
,或Driver::getTeamName
用于其他版本。
请注意,mapToInt
在获取 之前对字符串长度进行更简单一些max
,因为这样可以避免两次获取字符串长度,然后您就有了,IntStream
因此您不需要提供显式比较器。
我还建议使用方法引用Driver::getName
而不是像 lambda 这样的方法引用,t -> t.getName()
因为这样可以更明确地说明您获得的名称是什么类型的东西。
推荐阅读
- python - 如何将数据帧导出到谷歌云存储桶中的 csv
- python - 如何使用for循环查找字符串中子字符串的所有实例
- workflow - Magento2 开发工作流程(我疯了吗?)
- amazon-web-services - 如何知道亚马逊 emr 集群上的 mapred-site 值?
- ios - 当手指离开视图时停止 UILongPressGestureRecognizer
- python - 如何根据列表中的部分键重新排列有序字典
- terminal - 如何安装 netCDF4?
- excel - 如何在具有额外(非日期)列的数据透视表中对日期进行分组
- python - range() 中的计数器无法识别为整数
- javascript - 如果修改了数据库表,则对 Vue 组件进行实时更改