加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 最简单的方式来索引一个集合的属性,该属性本身就是一个

发布时间:2020-12-15 00:05:32 所属栏目:Java 来源:网络整理
导读:我有一个列表 Foo并想要一个番石榴Multimap String,Foo我们把它们的Collection String的每个标签分成了Foo getTags()函数. 我使用java 8,所以lambdas和方法引用是罚款/鼓励. 例如,如果我有: foo1,tags=a,b,cfoo2,tags=c,dfoo3,c,e 我会得到一个Multimap Str
我有一个列表< Foo>并想要一个番石榴Multimap< String,Foo>我们把它们的Collection< String>的每个标签分成了Foo getTags()函数.

我使用java 8,所以lambdas和方法引用是罚款/鼓励.

例如,如果我有:

foo1,tags=a,b,c
foo2,tags=c,d
foo3,c,e

我会得到一个Multimap< String,Foo>有:

a -> foo1,foo3
b -> foo1
c -> foo1,foo2,foo3
d -> foo2
e -> foo3

解决方法

您可以使用自定义收藏夹:
Multimap<String,Foo> map = list.stream().collect(
    ImmutableMultimap::builder,(builder,value) -> value.getTags().forEach(tag -> builder.put(tag,value)),(builder1,builder2) -> builder1.putAll(builder2.build())
).build();

这不会引起额外的副作用(参见here),是并发的,比较惯用的.

您还可以将这些特别的羔羊提取成一个完整的收藏家,如下所示:

public static <T,K> Collector<T,?,Multimap<K,T>> toMultimapByKey(Function<? super T,? extends Iterable<? extends K>> keysMapper) {
    return new MultimapCollector<>(keysMapper);
}

private static class MultimapCollector<T,K> implements Collector<T,ImmutableMultimap.Builder<K,T>,T>> {
    private final Function<? super T,? extends Iterable<? extends K>> keysMapper;

    private MultimapCollector(Function<? super T,? extends Iterable<? extends K>> keysMapper) {
        this.keysMapper = keysMapper;
    }

    @Override
    public Supplier<ImmutableMultimap.Builder<K,T>> supplier() {
        return ImmutableMultimap::builder;
    }

    @Override
    public BiConsumer<ImmutableMultimap.Builder<K,T> accumulator() {
        return (builder,value) -> keysMapper.apply(value).forEach(k -> builder.put(k,value));
    }

    @Override
    public BinaryOperator<ImmutableMultimap.Builder<K,T>> combiner() {
        return (b1,b2) -> b1.putAll(b2.build());
    }

    @Override
    public Function<ImmutableMultimap.Builder<K,T>> finisher() {
        return ImmutableMultimap.Builder<K,T>::build;
    }

    @Override
    public Set<Characteristics> characteristics() {
        return Collections.emptySet();
    }
}

那么收藏将如下所示:

Multimap<String,Foo> map = list.stream().collect(toMultimapByKey(Foo::getTags));

如果您的订单不重要,您还可以从特性()方法返回EnumSet.of(Characteristics.UNORDERED).这可以使内部收集机械更有效地起作用,特别是在并行还原的情况下.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读