使用 Java8 Streams 减少 if-else 语句,同时过滤多个条件

问题描述 投票:0回答:1

我收到了同行的评论,说我需要减少代码中多个 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 中给了我一个错误

所需类型谓词 提供谓词

  1. 如何减少 If-Else 链?
  2. 如何过滤集合内流中超出该集合范围的数据?
  3. 这个问题有更好或更优雅的解决方案吗?
java if-statement java-8 java-stream
1个回答
0
投票

一种简单的方法是使用提前退货。

例如

if(foo) {
 return "foo";
}

if(bar) {
 return "bar";
}

etc...
© www.soinside.com 2019 - 2024. All rights reserved.