我收到了同行的评论,说我需要减少代码中多个 If-else 块的使用,而是使用命令式编程技术来实现相同的功能
背景 我有一个事件列表,我需要根据几个条件返回一个事件对象。对于 SOP 事件和 SOP 确认事件,列表的大小可以是 2 或 3,对于非 Sop 确认事件,大小为 2,但是事件类型不同,最终有一个大小为1的事件。
//All Required Predicates
//SOP Special Event
if(eventList.size() >1 && results.getAcknowledgeUid().isEmpty()){
event = eventList.stream().filter(isOriginalEvent.and(isSOPEvent).and(isSOPSpecialEvent))
.findFirst().orElse(null);
}
else if (eventList.size() >1 && !results.getAcknowledgeUid().isEmpty()) {
// SOP Acnknowledge Event
if("SOP".equalsIgnoreCase(eventList.get(0).getEventType())) {
event = eventList.stream().filter(isAcknowledgeEvent)
.findFirst().orElse(null);
}
// Non SOP Acnknowledge Event
List<event> eventAcnknowledgeList = repository.findEventByUid(results.getAcnknowledgeUid);
event = eventAcnknowledgeList.stream().filter(isAcnknowledgeEvent)
.findFirst().orElse(null);
}
// Single Event
else if (eventList.size() >0) {
event = eventList.stream().filter(isOriginalEvent).findFirst().orElse(null);
}
我将 if else 块中的所有条件移至谓词,现在看起来很紧凑。但我仍然无法减少 if-else 链。我考虑使用三元运算符来合并第二个和第三个块,但如果我这样做,代码看起来很笨拙。 我也无法执行以下操作。
Predicate<List<Event>> isMoreThanTwoEvents = event -> eventList.size() > 1;
event = eventList.stream().filter(isAcknowledgeEvent.and(isSOPEvent).and(isMoreThanTwoEvents))
.findFirst().orElse(null);
这在 IDE 中给了我一个错误
所需类型谓词 提供谓词
一种简单的方法是使用提前退货。
例如
if(foo) {
return "foo";
}
if(bar) {
return "bar";
}
etc...