collector list 多个分组_将列表中的元素分组为子列表(可能使用番石榴)

小编典典

ImmutableListMultimap indexed = Multimaps.index(list, groupFunction);

如果给出具体的用例,将更容易展示它的实际作用。

来自文档的示例:

List badGuys =

Arrays.asList("Inky", "Blinky", "Pinky", "Pinky", "Clyde");

Function stringLengthFunction = ...;

Multimap index =

Multimaps.index(badGuys, stringLengthFunction);

System.out.println(index);

版画

{4=[Inky], 6=[Blinky], 5=[Pinky, Pinky, Clyde]}

在您的情况下,如果GroupFunction定义为:

GroupFunction groupFunction = new GroupFunction() {

@Override public String sameGroup(final String s1, final String s2) {

return s1.length().equals(s2.length());

}

}

那么它将转换为:

Function stringLengthFunction = new Function() {

@Override public Integer apply(final String s) {

return s.length();

}

}

这是stringLengthFunctionGuava示例中可能使用的实现。

最后,在Java 8中,整个片段甚至可以变得更加简单,因为lambas和方法引用足够简洁,可以内联:

ImmutableListMultimap indexed = Multimaps.index(list, String::length);

对于使用纯Java

8(无Guava)的示例,Collector.groupingBy请参见[JeffreyBosboom的答案],尽管该方法几乎没有区别:

它不会返回ImmutableListMultimap,而是Map带有Collection值,

对于返回的Map (源) 的类型,可变性,可序列化性或线程安全性,不做任何保证 ,

它比Guava +方法参考更为冗长。

编辑 :如果您不关心索引键,则可以获取分组值:

List> grouped = Lists.transform(indexed.keySet().asList(), new Function>() {

@Override public List apply(E key) {

return indexed.get(key);

}

});

// or the same view, but with Java 8 lambdas:

List> grouped = Lists.transform(indexed.keySet().asList(), indexed::get);

首先,您Lists>可以根据需要查看哪些内容可以轻松复制ArrayList或按原样使用。还要注意的indexed.get(key)是ImmutableList。

// bonus: similar as above, but not a view, instead collecting to list using streams:

List> grouped = indexed.keySet().stream()

.map(indexed::get)

.collect(Collectors.toList());

编辑2 :正如Petr Gladkikh在下面的评论中提到的,如果Collection>足够的话,上面的示例可能会更简单:

Collection> grouped = indexed.asMap().values();

2020-10-18

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值