重複した素材の抽出のみ絞ったリストを生成するのを 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().collect( ArrayList::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(