From 21bb5a036ca87ca028bd6dc18516b191e4427149 Mon Sep 17 00:00:00 2001 From: Valentyn Kolesnikov Date: Fri, 15 Sep 2023 04:51:51 +0300 Subject: [PATCH] Added U.associateBy(iterable, func) --- src/main/java/com/github/underscore/U.java | 5 +++++ .../com/github/underscore/Underscore.java | 19 ++++++++++++++++++ .../github/underscore/CollectionsTest.java | 20 +++++++++++++++++++ .../com/github/underscore/LodashTest.java | 1 + 4 files changed, 45 insertions(+) diff --git a/src/main/java/com/github/underscore/U.java b/src/main/java/com/github/underscore/U.java index 644eb59a..5e7a8496 100644 --- a/src/main/java/com/github/underscore/U.java +++ b/src/main/java/com/github/underscore/U.java @@ -367,6 +367,11 @@ public Chain>> groupBy(final Function func) { return new Chain<>(Underscore.groupBy(value(), func)); } + @Override + public Chain> associateBy(final Function func) { + return new Chain<>(Underscore.associateBy(value(), func)); + } + @Override public Chain>> groupBy( final Function func, final BinaryOperator binaryOperator) { diff --git a/src/main/java/com/github/underscore/Underscore.java b/src/main/java/com/github/underscore/Underscore.java index de6893bb..691e7ac1 100644 --- a/src/main/java/com/github/underscore/Underscore.java +++ b/src/main/java/com/github/underscore/Underscore.java @@ -1046,6 +1046,21 @@ public Map> groupBy( return groupBy((Iterable) iterable, func, binaryOperator); } + public static Map associateBy( + final Iterable iterable, final Function func) { + final Map retVal = newLinkedHashMap(); + for (E e : iterable) { + final K key = func.apply(e); + retVal.putIfAbsent(key, e); + } + return retVal; + } + + @SuppressWarnings("unchecked") + public Map associateBy(final Function func) { + return associateBy((Iterable) iterable, func); + } + @SuppressWarnings("unchecked") public static Map> indexBy( final Iterable iterable, final String property) { @@ -3000,6 +3015,10 @@ public Chain>> groupBy(final Function func) { return new Chain<>(Underscore.groupBy(list, func)); } + public Chain> associateBy(final Function func) { + return new Chain<>(Underscore.associateBy(list, func)); + } + public Chain>> groupBy( final Function func, final BinaryOperator binaryOperator) { return new Chain<>(Underscore.groupBy(list, func, binaryOperator)); diff --git a/src/test/java/com/github/underscore/CollectionsTest.java b/src/test/java/com/github/underscore/CollectionsTest.java index b1336a81..4d783dfe 100644 --- a/src/test/java/com/github/underscore/CollectionsTest.java +++ b/src/test/java/com/github/underscore/CollectionsTest.java @@ -1436,6 +1436,26 @@ void groupBy() { assertEquals("{1.0=[1.3], 2.0=[2.1, 2.4]}", resultChain.toString()); } + /* + _.associateBy([1.3, 2.1, 2.4], function(num){ return Math.floor(num); }); + => {1: [1.3], 2: [2.1, 2.4]} + */ + @Test + @SuppressWarnings("unchecked") + void associateBy() { + final Map result = + Underscore.associateBy(asList(1.3, 2.1, 2.4), Math::floor); + assertEquals("{1.0=1.3, 2.0=2.1}", result.toString()); + final Map resultObj = + new Underscore(asList(1.3, 2.1, 2.4)) + .associateBy((Function) Math::floor); + assertEquals("{1.0=1.3, 2.0=2.1}", resultObj.toString()); + final Map resultChain = + (Map) + Underscore.chain(asList(1.3, 2.1, 2.4)).associateBy(Math::floor).item(); + assertEquals("{1.0=1.3, 2.0=2.1}", resultChain.toString()); + } + /* _.groupBy([1.3, 2.1, 2.4], function(num){ return Math.floor(num); }); => {1: [1.3], 2: [2.1, 2.4]} diff --git a/src/test/java/com/github/underscore/LodashTest.java b/src/test/java/com/github/underscore/LodashTest.java index 6a11e52b..31b06a77 100644 --- a/src/test/java/com/github/underscore/LodashTest.java +++ b/src/test/java/com/github/underscore/LodashTest.java @@ -1780,6 +1780,7 @@ void chain() { U.chain(new Integer[] {0}).sortBy(value -> value); U.chain(new LinkedHashMap().entrySet()).sortBy(""); U.chain(new Integer[] {0}).groupBy(value -> value); + U.chain(new Integer[] {0}).associateBy(value -> value); U.chain(new Integer[] {0}).groupBy(num -> num, (a, b) -> a); U.chain(new Integer[] {0}).indexBy(""); U.chain(new Integer[] {0}).countBy(value -> value);