日付期間重複の抽出

昨日、書いた日付期間のインターフェース DateSpan
これを使って、

BiConsumer の 期間が重複している重複日と重複した要素のリストを処理するメソッドを用意します。

public static void booklist(List<? extends DateSpan> list, BiConsumer<LocalDate, List<? super DateSpan>> bookConsumer){
   AtomicInteger i = new AtomicInteger(0);
   Map<LocalDate, List<? super DateSpan>> map = new HashMap<>();
   list.stream().forEach(e->{
      list.subList(i.incrementAndGet(), list.size()).stream()
      .filter(t->e.isBook(t.start(), t.end()))
      .forEach(t->{
         SimpleEntry<LocalDate, LocalDate> key
          = new SimpleEntry<>(e.start().compareTo(t.start()) <= 0 && t.start().compareTo(e.end()) <= 0 ? t.start() : e.start()
               , e.start().compareTo(t.end()) <= 0 && t.end().compareTo(e.end()) <= 0 ? t.end() : e.end() );
         for(LocalDate dt=key.getKey(); dt.compareTo(key.getValue()) <= 0;dt=dt.plusDays(1)){
            List<? super DateSpan> plist = map.containsKey(dt) ? map.get(dt) : new ArrayList<>();
            plist.add(e);
            plist.add(t);
            map.put(dt, plist);
         }
      });
   });
   map.keySet().stream().sorted().forEach(k->{
      bookConsumer.accept(k, map.get(k).stream().distinct().collect(Collectors.toList()));
   });
}

使う時は、、

List<? extends DateSpan> list;

booklist(list, (k, t)->{
     // k = 重複発生日
     // t = 重複発生した日、1日に該当する要素のリスト、2個以上のリスト
});

ということです。