Skip to content

Commit d025ca0

Browse files
authored
Add $.groupBy(iterator, function, binaryOperator) method.
1 parent 5a02cfc commit d025ca0

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

src/main/java/com/github/underscore/$.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -805,6 +805,32 @@ public <K, E> Map<K, List<E>> groupBy(final Function<E, K> func) {
805805
return groupBy((Iterable<E>) iterable, func);
806806
}
807807

808+
public static <K, E> Map<K, Optional<E>> groupBy(final Iterable<E> iterable, final Function<E, K> func,
809+
final BinaryOperator<E> binaryOperator) {
810+
final Map<K, List<E>> retVal = newLinkedHashMap();
811+
for (E e : iterable) {
812+
final K key = func.apply(e);
813+
List<E> val;
814+
if (retVal.containsKey(key)) {
815+
val = retVal.get(key);
816+
} else {
817+
val = newArrayList();
818+
}
819+
val.add(e);
820+
retVal.put(key, val);
821+
}
822+
final Map<K, Optional<E>> retVal2 = newLinkedHashMap();
823+
for (Map.Entry<K, List<E>> entry : retVal.entrySet()) {
824+
retVal2.put(entry.getKey(), reduce(entry.getValue(), binaryOperator));
825+
}
826+
return retVal2;
827+
}
828+
829+
@SuppressWarnings("unchecked")
830+
public <K, E> Map<K, Optional<E>> groupBy(final Function<E, K> func, final BinaryOperator<E> binaryOperator) {
831+
return groupBy((Iterable<E>) iterable, func, binaryOperator);
832+
}
833+
808834
@SuppressWarnings("unchecked")
809835
public static <K, E> Map<K, List<E>> indexBy(final Iterable<E> iterable, final String property) {
810836
return groupBy(iterable, new Function<E, K>() {

src/test/java/com/github/underscore/CollectionsTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1485,6 +1485,42 @@ public Double apply(Double num) {
14851485
assertEquals("{1.0=[1.3], 2.0=[2.1, 2.4]}", resultChain.toString());
14861486
}
14871487

1488+
/*
1489+
_.groupBy([1.3, 2.1, 2.4], function(num){ return Math.floor(num); });
1490+
=> {1: [1.3], 2: [2.1, 2.4]}
1491+
*/
1492+
@Test
1493+
@SuppressWarnings("unchecked")
1494+
public void groupByWithSumming() {
1495+
final Map<Double, Optional<Double>> result =
1496+
$.groupBy(asList(1.3, 2.1, 2.4),
1497+
new Function<Double, Double>() {
1498+
public Double apply(Double num) {
1499+
return Math.floor(num);
1500+
}
1501+
},
1502+
new BinaryOperator<Double>() {
1503+
public Double apply(Double a, Double b) {
1504+
return a + b;
1505+
}
1506+
}
1507+
);
1508+
assertEquals("{1.0=Optional.of(1.3), 2.0=Optional.of(4.5)}", result.toString());
1509+
final Map<Double, Optional<Double>> resultObj =
1510+
new $(asList(1.3, 2.1, 2.4)).groupBy(
1511+
new Function<Double, Double>() {
1512+
public Double apply(Double num) {
1513+
return Math.floor(num);
1514+
}
1515+
},
1516+
new BinaryOperator<Double>() {
1517+
public Double apply(Double a, Double b) {
1518+
return a + b;
1519+
}
1520+
});
1521+
assertEquals("{1.0=Optional.of(1.3), 2.0=Optional.of(4.5)}", resultObj.toString());
1522+
}
1523+
14881524
/*
14891525
var stooges = [{name: 'moe', age: 40}, {name: 'larry', age: 50}, {name: 'curly', age: 60}];
14901526
_.indexBy(stooges, 'age');

0 commit comments

Comments
 (0)