java - 接受泛型 List 作为参数并根据其类型使用它
问题描述
我正在为我的公司开发一个网站,我使用 Spring 作为我的后端。现在有一种情况,我需要两次使用我的 Utils 方法之一,但用于不同的 DAO。
为了避免代码重复,我想知道如何使用 Java 泛型以使此方法可用于两种情况。该方法只计算两个 DAO 共有的字段之一。
实用方法:
SeverityCount calculateSeveritiesCount(List<?> events){
if(null == events){
return new SeverityCount();
}
if(events.get(1) instanceof EventDAO){
events = (List<EventDAO>)events;
}
else if (events.get(1) instanceof EventsByAreaDAO) {
events = (List<EventsByAreaDAO>)events;
}
Map<String, Long> severityCountMap = events.stream().collect(
Collectors.groupingBy(
EventDAO::getSeverity, //It should be EventDAO or EventsByAreaDAO. both has severity field.
Collectors.counting())
);
return mapper.convertValue(severityCountMap, SeverityCount.class);
}
事件 DAO:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "events")
public class EventDAO {
@Id @Column(name = "uid")
private String uID;
private String date;
private String severity;
}
区域道:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "events")
public class EventsByRegionDAO {
@Id @Column(name = "uid")
private String uID;
private String date;
private String type;
private String severity;
private String area;
private String server;
}
这就是我从服务中调用它的方式:
SeverityCount severitiesCount = Utils.calculateSeveritiesCount(eventsList); //EventsList could be list of EventDAO or EventsByAreaDAO
解决方案
您可以将方法更改为
SeverityCount calculateSeveritiesCount(List<? extends SeverityCalculable> events)
在哪里SeverityCalculable
interface SeverityCalculable {
String getSeverity(); // implemente getter in all subclasses
}
让所有相关的类都实现这个接口。
public class EventDAO implements SeverityCalculable {
// ...
@Override
public String getSeverity() {
return this.severity;
}
}
现在在您的方法中,删除演员表,它应该变成这样:
SeverityCount calculateSeveritiesCount(List<? extends SeverityCalculable> events) {
if(null == events){
return new SeverityCount();
}
Map<String, Long> severityCountMap = events.stream().collect(
Collectors.groupingBy(
SeverityCalculable::getSeverity,
Collectors.counting()
)
);
return mapper.convertValue(severityCountMap, SeverityCount.class);
}
推荐阅读
- python - 在python中需要帮助
- python - 权重和偏差扫描无法使用 pytorch 闪电导入模块
- java - 关于Java反射的面试题
- java - Spring Cloud Gateway:如何修改 SSE Flux Stream
- vb.net - 跟踪栏使用 If 语句而不是 Select Case 更改变量值
- laravel - Laravel,碳,日期差异不包括
- jooq - 如何在最终构建中包含 Jooq 代码生成
- html - 使用 jQuery 在 IE Edge 中获取元素 outerHeight 的问题
- python - Pandas DataFrame 填充列中的缺失值
- reactjs - 如何使用打字稿根据选定的选项卡显示来自对象的相关信息并做出反应?