From 2e6da0051cfb3ae264cf8ac0d0132e36b022dca4 Mon Sep 17 00:00:00 2001 From: Greyson Fischer Date: Tue, 3 Apr 2018 10:27:59 -0400 Subject: [PATCH] Added stream-compatible collector for `Set` --- .../andrewoma/dexx/collection/Sets.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/collection/src/main/java/com/github/andrewoma/dexx/collection/Sets.java b/collection/src/main/java/com/github/andrewoma/dexx/collection/Sets.java index 34a1c9f..08d56a8 100644 --- a/collection/src/main/java/com/github/andrewoma/dexx/collection/Sets.java +++ b/collection/src/main/java/com/github/andrewoma/dexx/collection/Sets.java @@ -179,4 +179,52 @@ public static BuilderFactory> factory() { public static Builder> builder() { return Sets.factory().newBuilder(); } + + public static Collector< A, Builder< A, Set< A > >, Set< A > > collector() + { + return new SetCollector<>(); + } + + private static class SetCollector< A > implements Collector< A, Builder< A, Set< A > >, Set< A > > + + + @Override + public Supplier< Builder< A, Set< A > > > supplier() + { + return Sets::builder; + } + + @Override + public BiConsumer< Builder< A, Set< A > >, A > accumulator() + { + return Builder::add; + } + + @Override + public BinaryOperator< Builder< A, Set< A > > > combiner() + { + return SetCollector::combinerImpl; + } + + private static < A > Builder< A, Set< A > > combinerImpl( Builder< A, Set< A > > left, Builder< A, Set< A > > right ) + { + return left.addAll( right.build().asSet() ); + } + + @Override + public Function< Builder< A, Set< A > >, Set< A > > finisher() + { + return Builder::build; + } + + @Override + public java.util.Set< Characteristics > characteristics() + { + return characteristics.asSet(); + } + + private Set< Characteristics > characteristics = Sets.of(); + + } + }