如何解决Java Lambda 函数接口提取到常用方法
我有 2 个类并包含以下属性 languageMap
class Person {
Map<String,String> languageMap;
}
class Employee {
Map<String,String> languageMap;
}
有两个方法addressMap(List<Person> persons)
和employeeMap(List<Employee> employee)
调用Function接口,
public Map<String,String addressMap(List<Person> persons){
Function<Collection<Person>,Map<String,String>> personFunc = CommonUtils::buildPersonMap;
return personFunc.apply(persons);
}
public Map<String,String employeeMap(List<Employee> employee){
Function<Collection<Employee>,String>> addressFunc = CommonUtils::buildEmployeeMap;
return addressFunc.apply(employee);
}
private static Map<String,String> buildPersonMap(Collection<Person> personItem) {
return personItem.stream()
.filter(element -> element.getLanguageMap() != null)
.flatMap(element -> element.getLanguageMap()
.entrySet()
.stream())
.filter(map -> map.getKey() != null && map.getValue() != null)
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue,(a,b) -> a));
}
private static Map<String,String> buildEmployeeMap(Collection<Employee> employeeItem) {
return employeeItem.stream()
.filter(element -> element.getLanguageMap() != null)
.flatMap(element -> element.getLanguageMap()
.entrySet()
.stream())
.filter(map -> map.getKey() != null && map.getValue() != null)
.collect(Collectors.toMap(Map.Entry::getKey,b) -> a));
}
我想让 2 个 buildXXX()
方法通用,并尝试使用泛型如下,
private static Map<String,String> buildMap(Collection<?> input) {
return input.stream()
.filter(element -> element.getLanguageMap() != null). // ERROR
.flatMap(element -> element.getLanguageMap().entrySet().stream()) // ERROR
.filter(map -> map.getKey() != null && map.getValue() != null)
.collect(Collectors.toMap(Map.Entry::getKey,b) -> a));
}
有什么泛型或流技术可以解决这个问题?
解决方法
您可以让调用者为每种类型发送一个 getter,并以这种方式实现您的方法:
private static <T> Map<String,String> buildMap(Collection<T> input,Function<T,Map<String,String>> languageMapGetter) {
return input.stream()
.map(languageMapGetter) //you can also call it yourself
.filter(Objects::nonNull)
.flatMap(element -> element.entrySet().stream())
.filter(map -> map.getKey() != null && map.getValue() != null)
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue,(a,b) -> a));
}
这将使您的特定于类型的方法如下所示:
public Map<String,String> addressMap(List<Person> persons) {
return CommonUtils.buildMap(persons,Person::getLanguageMap);
}
public Map<String,String> employeeMap(List<Employee> employee) {
return CommonUtils.buildMap(employee,Employee::getLanguageMap);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。