문제

List<Foo> 고 원 Multimap<String, Foo> 우리가 그룹화 Foo's 여 그들의 getId() 기능입니다.

내가 사용하 Java8 고 그 거의 굉장에서는 할 수 있습니다:

List<Foo> foos = ...
Map<String, List<Foo>> foosById = foos.stream().collect(groupingBy(Foo::getId));

그러나 나는 좋은 양의 코드는 원하는 MultiMap<String, Foo> 그래서 이 사장 저에게 아무것도 나는 사용을 위한 루프를 만드는 내 MultiMap.은 거기에 좋은"기능"는 방식으로 난이 없는가?

도움이 되었습니까?

해결책

당신이 사용할 수 있습니다 구아바 Multimaps 공장:

Multimaps.index(foos, Foo::getId);

또는 포장을 호출하 Multimaps.인덱스를 가진 수집기 인터페이스(아래 그림에서는 최적화되지 않은 단순한 구현에).

Multimap<String, Foo> collect = foos.stream().collect(MultimapCollector.toMultimap(Foo::getId));

과 수집기:

public class MultimapCollector<T, K, V> implements Collector<T, Multimap<K, V>, Multimap<K, V>> {

    private final Function<T, K> keyGetter;
    private final Function<T, V> valueGetter;

    public MultimapCollector(Function<T, K> keyGetter, Function<T, V> valueGetter) {
        this.keyGetter = keyGetter;
        this.valueGetter = valueGetter;
    }

    public static <T, K, V> MultimapCollector<T, K, V> toMultimap(Function<T, K> keyGetter, Function<T, V> valueGetter) {
        return new MultimapCollector<>(keyGetter, valueGetter);
    }

    public static <T, K, V> MultimapCollector<T, K, T> toMultimap(Function<T, K> keyGetter) {
        return new MultimapCollector<>(keyGetter, v -> v);
    }

    @Override
    public Supplier<Multimap<K, V>> supplier() {
        return ArrayListMultimap::create;
    }

    @Override
    public BiConsumer<Multimap<K, V>, T> accumulator() {
        return (map, element) -> map.put(keyGetter.apply(element), valueGetter.apply(element));
    }

    @Override
    public BinaryOperator<Multimap<K, V>> combiner() {
        return (map1, map2) -> {
            map1.putAll(map2);
            return map1;
        };
    }

    @Override
    public Function<Multimap<K, V>, Multimap<K, V>> finisher() {
        return map -> map;
    }

    @Override
    public Set<Characteristics> characteristics() {
        return ImmutableSet.of(Characteristics.IDENTITY_FINISH);
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top