Java 对类似方法使用泛型

Java 对类似方法使用泛型,java,generics,Java,Generics,这两种Java方法非常相似,但我不确定如何实现代码重用。我尝试创建一个泛型对象,但由于构造函数的原因,它是不允许的。我可以在这里使用泛型吗?或者事件和酒店是否应该有父母?我不确定我是否可以在这里使用接口 private List<Event> extractEvents(List<String> eventList) { return eventList.stream() .map(eventName -> new E

这两种Java方法非常相似,但我不确定如何实现代码重用。我尝试创建一个泛型对象
,但由于构造函数的原因,它是不允许的。我可以在这里使用泛型吗?或者
事件
酒店
是否应该有父母?我不确定我是否可以在这里使用接口

private List<Event> extractEvents(List<String> eventList) {
    return eventList.stream()
                    .map(eventName -> new Event(eventName))
                    .collect(Collectors.toList());
}

private List<Hotel> extractHotels(List<String> hotelList) {
    return hotelList.stream()
                    .map(hotelName -> new Hotel(hotelName))
                    .collect(Collectors.toList());
}
私有列表事件(列表事件列表){
返回eventList.stream()
.map(事件名称->新事件(事件名称))
.collect(Collectors.toList());
}
私人列表酒店(列表酒店列表){
return hotelList.stream()
.map(hotelName->新酒店(hotelName))
.collect(Collectors.toList());
}

您可以分别传入映射器:

private <T> List<T> extract(List<String> list, Function<String, T> mapper) {
    return list.stream()
               .map(mapper)
               .collect(Collectors.toList());
}
私有列表提取(列表、函数映射器){
return list.stream()
.map(mapper)
.collect(Collectors.toList());
}
List r1=提取(eventList,Event::new);
列表r2=摘录(hotelList,Hotel::new);

你可以让它更通用:
私有列表提取(列表,函数映射器)
它肯定更通用,应用范围更广,@Andreas。我认为抽象应该在某种程度上停止,以保持可读性。如果方法
extract
希望将原始字符串转换为某种自定义对象,则最好按照@Jorn Vernee的建议保留该方法。@DuongNguyen True,更通用的版本可能应称为
mapAll
,以反映其一般功能。当然,将字符串转换为对象通常称为解析或解组,因此
parseAll
可能是
string
特定版本的更好名称。命名得好@Andreas。这也意味着这种方法应该得到语言本身的更好支持,一些方便的
List.map
Set.map
来保存一些
.stream()
collect()
List<Event> r1 = extract(eventList, Event::new);
List<Hotel> r2 = extract(hotelList, Hotel::new);