@@ -159,6 +159,20 @@ public static <T, R> Function<T, Stream<R>> expand(
159159 return it -> concat (Stream .of (it ).map (base ), by .apply (it ));
160160 }
161161
162+ public static <T , C > Function <T , Stream <T >> distinctBy (final Function <T , C > mapper ) {
163+ return new Function <T , Stream <T >>() {
164+ final HashSet <C > checkValues = new HashSet <>();
165+
166+ @ Override
167+ public Stream <T > apply (T t ) {
168+ var c = mapper .apply (t );
169+ if (checkValues .add (c ))
170+ return Stream .of (t );
171+ return empty ();
172+ }
173+ };
174+ }
175+
162176 @ SuppressWarnings ("ReplaceInefficientStreamCount" )
163177 public static <T > Collector <T , Set <T >, Stream <T >> expandRecursive (Function <? super T , Stream <? extends T >> by ) {
164178 return Collector .of (HashSet ::new ,
@@ -180,7 +194,7 @@ public static <T> Collector<T, List<T>, List<List<T>>> groupingEvery(long groupS
180194 l .addAll (r );
181195 return l ;
182196 }, ls -> {
183- var out = new ArrayList <List <T >>();
197+ var out = new ArrayList <List <T >>();
184198 var iter = ls .iterator ();
185199 ArrayList <T > group = null ;
186200 while (iter .hasNext ()) {
@@ -421,9 +435,7 @@ public static <A, B, Y> Function<Entry<A, B>, Entry<A, Y>> crossA2B(
421435
422436 @ WrapWith ("map" )
423437 public static <A , B , X , Y > Function <Entry <A , B >, Entry <X , Y >> cross (
424- final @ NotNull BiFunction <A , B , X > xFunction ,
425- final @ NotNull BiFunction <A , B , Y > yFunction
426- ) {
438+ final @ NotNull BiFunction <A , B , X > xFunction , final @ NotNull BiFunction <A , B , Y > yFunction ) {
427439 return e -> new SimpleImmutableEntry <>(xFunction .apply (e .getKey (), e .getValue ()),
428440 yFunction .apply (e .getKey (), e .getValue ()));
429441 }
@@ -510,9 +522,7 @@ public static <A, B, E extends Entry<A, B>> Function<E, Stream<E>> filter(
510522
511523 @ WrapWith ("flatMap" )
512524 public static <A , B , E extends Entry <A , B >> Function <E , Stream <E >> filter (
513- final @ NotNull BiPredicate <A , B > predicate ,
514- final @ NotNull BiConsumer <A , B > disposal
515- ) {
525+ final @ NotNull BiPredicate <A , B > predicate , final @ NotNull BiConsumer <A , B > disposal ) {
516526 return e -> {
517527 if (predicate .test (e .getKey (), e .getValue ())) return Stream .of (e );
518528 disposal .accept (e .getKey (), e .getValue ());
@@ -540,9 +550,7 @@ public static <A, B, E extends Entry<A, B>> Function<E, Stream<E>> filterB(@NotN
540550
541551 @ WrapWith ("flatMap" )
542552 public static <A , B , E extends Entry <A , B >> Function <E , Stream <E >> filterA (
543- final @ NotNull Predicate <A > predicate ,
544- final @ NotNull Consumer <A > disposal
545- ) {
553+ final @ NotNull Predicate <A > predicate , final @ NotNull Consumer <A > disposal ) {
546554 return filter (predicate , disposal , $ -> true , nop ());
547555 }
548556
@@ -567,9 +575,7 @@ public static <A, B, E extends Entry<A, B>> Function<E, Stream<E>> filter(
567575
568576 @ WrapWith ("flatMap" )
569577 public static <A , B , E extends Entry <A , B >> Function <E , Stream <E >> filterB (
570- final @ NotNull Predicate <B > predicate ,
571- final @ NotNull Consumer <B > disposal
572- ) {
578+ final @ NotNull Predicate <B > predicate , final @ NotNull Consumer <B > disposal ) {
573579 return filter ($ -> true , nop (), predicate , disposal );
574580 }
575581
0 commit comments