【问题标题】:Removing from List with date comparing从列表中删除日期比较
【发布时间】:2019-07-14 00:57:43
【问题描述】:

我必须删除param.getFromDateTime 之前和params.getToDateTime 之后的所有对象。我是这样做的:

for (ListIterator<Doc> iterator = doc.listIterator(); iterator.hasNext(); ) {
    while(iterator.hasNext()){
            if(param.getFromDateTime() != null
              && doc.get(iterator.nextIndex()).getDate().before(params.getFromTime())) {
                iterator.remove();
            }
            if(params.getToDateTime() != null
              && doc.get(iterator.nextIndex()).getDate().after(params.getToDateTime())) {
                iterator.remove();
           }
    }
}

我可以做得更好更清晰吗?

【问题讨论】:

  • 为什么要调用doc.get(iterator.nextIndex()) 而不是iterator.next() 并重用返回的元素?为什么要使用 2 个嵌套循环?
  • 我认为你应该把这个发到codereview,而不是这里。

标签: java list iterator refactoring


【解决方案1】:

您不需要两个循环,也不需要ListIterator
请注意,这两个条件可能为真,但在任何情况下您都只想删除一个元素,因为调用两次 remove() 会引发异常。
您也可以直接从迭代的Doc 对象中提取date 以使其更加清晰:

for (Iterator<Doc> iterator = doc.iterator(); iterator.hasNext(); ) {
      Date date = iterator.next().getDate();

      if( (param.getFromDateTime() != null && date.before(params.getFromTime())) 
          || (params.getToDateTime() != null && date.after(params.getToDateTime()))) {
        iterator.remove();
      }

}

【讨论】:

  • 两次调用remove()时出现异常的警告非常有用!非常感谢!
  • 不客气。我添加了一个额外的重构。最后我们这里不需要Doc 变量。
【解决方案2】:

如果您使用的是 Java 8,您可能需要使用 List.removeIf

List<Doc> docs = generateSomeValues(); // this ist just an imaginary filling of the list
// check if the params are not null and remove dates that are not in the given interval
docs.removeIf(doc ->
    (params.getFromTime() != null && doc.getDate().before(params.getFromTime()))
    || (params.getToDateTime() != null && doc.getDate().after(params.getToDateTime()))
);

【讨论】:

    【解决方案3】:

    带有流 api 的 java-8 近似:

    List<Doc> docs = ...;
    Stream<Doc> stream = docs.stream();
    LocalDateTime fromDateTime = param.getFromDateTime();
    LocalDateTime toDateTime = param.getToDateTime();
    if (fromDateTime != null){
        stream = stream.filter(d -> !d.getDate().before(fromDateTime);
    }
    if (toDateTime != null){
        stream = stream.filter(d -> !d.getDate().after(toDateTime);
    }
    docs = stream.collect(Collectors.toList());
    

    【讨论】:

      猜你喜欢
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多