読者です 読者をやめる 読者になる 読者になる

利用期間重複の詳細リストを求める(2)

先日書いた 利用期間重複の詳細リストを求める(1) から、ちょっと目的が外れるけど、
重複した素材の抽出のみ絞ったリストを生成するのを Java8 Stream で考えてみた。

素材のオブジェクト
public class Element {
  public int id;
  public Date start_date;
  public Date end_date;
}


collect を使う。本来、ParallelStream で、
<R> R collect(Supplier<R> supplier,
     BiConsumer<R,? super T> accumulator,
     BiConsumer<R,R> combiner
)

を使うのが、collect の姿なんだろうけど、これを使ってみる。

List<Element> results = list.stream().collectArrayList::new,
   (List<Element> rlist, Element t)->{
      for(Element e: list.stream().filter*1;

これで、results には、重複したものだけが格納される。

ParallelStream でなければ、combinerは実行されない。

つぎのコードで確認すれば、満足であろう。
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
for(Element e:results){
  System.out.println(e.id+"--" + sf.format(e.start_date) + "-" + sf.format(e.end_date) );
}


次回は、やはり重複した日ごとのリストを作ってみたい。

*1:e)->{ return !e.equals(t);}).collect(Collectors.toList())){
         if (t.start_date.compareTo(e.end_date) <= 0 && t.end_date.compareTo(e.start_date) >= 0){
            rlist.add(e);
         }
      }
   },
   (t, u)->{}
).stream().distinct().collect(Collectors.toList(