mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-04-19 03:01:48 +08:00
添加支持对值集合进行映射的分组方法
This commit is contained in:
parent
c56f36ac4f
commit
d799e43e54
@ -147,6 +147,67 @@ public class CollectorUtil {
|
||||
return groupingBy(classifier, Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* 提供对null值友好的groupingBy操作的{@link Collector}实现,
|
||||
* 对集合分组,然后对分组后的值集合进行映射
|
||||
*
|
||||
* @param classifier 分组依据
|
||||
* @param valueMapper 值映射方法
|
||||
* @param valueCollFactory 值集合的工厂方法
|
||||
* @param mapFactory Map集合的工厂方法
|
||||
* @param <T> 元素类型
|
||||
* @param <K> 键类型
|
||||
* @param <R> 值类型
|
||||
* @param <C> 值集合类型
|
||||
* @param <M> 返回的Map集合类型
|
||||
* @return {@link Collector}
|
||||
*/
|
||||
public static <T, K, R, C extends Collection<R>, M extends Map<K, C>> Collector<T, ?, M> groupingBy(
|
||||
final Function<? super T, ? extends K> classifier,
|
||||
final Function<? super T, ? extends R> valueMapper,
|
||||
final Supplier<C> valueCollFactory,
|
||||
final Supplier<M> mapFactory) {
|
||||
return groupingBy(classifier, mapFactory, Collectors.mapping(
|
||||
valueMapper, Collectors.toCollection(valueCollFactory)
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* 提供对null值友好的groupingBy操作的{@link Collector}实现,
|
||||
* 对集合分组,然后对分组后的值集合进行映射
|
||||
*
|
||||
* @param classifier 分组依据
|
||||
* @param valueMapper 值映射方法
|
||||
* @param valueCollFactory 值集合的工厂方法
|
||||
* @param <T> 元素类型
|
||||
* @param <K> 键类型
|
||||
* @param <R> 值类型
|
||||
* @param <C> 值集合类型
|
||||
* @return {@link Collector}
|
||||
*/
|
||||
public static <T, K, R, C extends Collection<R>> Collector<T, ?, Map<K, C>> groupingBy(
|
||||
final Function<? super T, ? extends K> classifier,
|
||||
final Function<? super T, ? extends R> valueMapper,
|
||||
final Supplier<C> valueCollFactory) {
|
||||
return groupingBy(classifier, valueMapper, valueCollFactory, HashMap::new);
|
||||
}
|
||||
|
||||
/**
|
||||
* 提供对null值友好的groupingBy操作的{@link Collector}实现,
|
||||
* 对集合分组,然后对分组后的值集合进行映射
|
||||
*
|
||||
* @param classifier 分组依据
|
||||
* @param valueMapper 值映射方法
|
||||
* @param <T> 元素类型
|
||||
* @param <K> 键类型
|
||||
* @param <R> 值类型
|
||||
* @return {@link Collector}
|
||||
*/
|
||||
public static <T, K, R> Collector<T, ?, Map<K, List<R>>> groupingBy(
|
||||
final Function<? super T, ? extends K> classifier,
|
||||
final Function<? super T, ? extends R> valueMapper) {
|
||||
return groupingBy(classifier, valueMapper, ArrayList::new, HashMap::new);
|
||||
}
|
||||
|
||||
/**
|
||||
* 对null友好的 toMap 操作的 {@link Collector}实现,默认使用HashMap
|
||||
|
@ -78,4 +78,28 @@ public class CollectorUtilTest {
|
||||
.put(3, 1L)
|
||||
.build(), map);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGroupingByAfterValueMapped() {
|
||||
List<Integer> list = Arrays.asList(1, 1, 2, 2, 3, 4);
|
||||
Map<Boolean, Set<String>> map = list.stream()
|
||||
.collect(CollectorUtil.groupingBy(t -> (t & 1) == 0, String::valueOf, LinkedHashSet::new, LinkedHashMap::new));
|
||||
|
||||
Assert.assertEquals(LinkedHashMap.class, map.getClass());
|
||||
Assert.assertEquals(new LinkedHashSet<>(Arrays.asList("2", "4")), map.get(Boolean.TRUE));
|
||||
Assert.assertEquals(new LinkedHashSet<>(Arrays.asList("1", "3")), map.get(Boolean.FALSE));
|
||||
|
||||
map = list.stream()
|
||||
.collect(CollectorUtil.groupingBy(t -> (t & 1) == 0, String::valueOf, LinkedHashSet::new));
|
||||
Assert.assertEquals(HashMap.class, map.getClass());
|
||||
Assert.assertEquals(new LinkedHashSet<>(Arrays.asList("2", "4")), map.get(Boolean.TRUE));
|
||||
Assert.assertEquals(new LinkedHashSet<>(Arrays.asList("1", "3")), map.get(Boolean.FALSE));
|
||||
|
||||
Map<Boolean, List<String>> map2 = list.stream()
|
||||
.collect(CollectorUtil.groupingBy(t -> (t & 1) == 0, String::valueOf));
|
||||
Assert.assertEquals(Arrays.asList("2", "2", "4"), map2.get(Boolean.TRUE));
|
||||
Assert.assertEquals(Arrays.asList("1", "1", "3"), map2.get(Boolean.FALSE));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user