当然是可能的,使用番石榴:)更容易使用 Multimaps.index(可迭代,函数)
:
ImmutableListMultimap<E, E> indexed = Multimaps.index(list, groupFunction);
如果您给出具体的用例,则更容易在操作中展示它。
来自文档的示例:
List<String> badGuys =
Arrays.asList("Inky", "Blinky", "Pinky", "Pinky", "Clyde");
Function<String, Integer> stringLengthFunction = ...;
Multimap<Integer, String> index =
Multimaps.index(badGuys, stringLengthFunction);
System.out.println(index);
指纹
{4=[Inky], 6=[Blinky], 5=[Pinky, Pinky, Clyde]}
在您的情况下,如果 GroupFunction 被定义为:
GroupFunction<String> groupFunction = new GroupFunction<String>() {
@Override public String sameGroup(final String s1, final String s2) {
return s1.length().equals(s2.length());
}
}
然后它将转换为:
Function<String, Integer> stringLengthFunction = new Function<String, Integer>() {
@Override public Integer apply(final String s) {
return s.length();
}
}
这是番石榴示例中使用的可能实现。stringLengthFunction
最后,在Java 8中,整个代码段可能更简单,因为lamba和方法引用足够简洁,可以内联:
ImmutableListMultimap<E, E> indexed = Multimaps.index(list, String::length);
对于使用 Collector.grouping
的纯 Java 8(无番石榴)示例,请参阅 Jeffrey Bosboom 的答案,尽管该方法几乎没有区别:
- 它不会返回,而是使用值,
ImmutableListMultimap
Map
Collection
对返回的 Map 的类型、可变性、可序列化性或线程安全性(源)没有保证,
- 它比番石榴+方法参考更详细一些。
编辑:如果你不关心索引键,你可以获取分组值:
List<List<E>> grouped = Lists.transform(indexed.keySet().asList(), new Function<E, List<E>>() {
@Override public List<E> apply(E key) {
return indexed.get(key);
}
});
// or the same view, but with Java 8 lambdas:
List<List<E>> grouped = Lists.transform(indexed.keySet().asList(), indexed::get);
什么可以让您查看哪些内容可以很容易地复制到或按原样使用,就像您首先想要的那样。另请注意,是 。Lists<List<E>>
ArrayList
indexed.get(key)
ImmutableList
// bonus: similar as above, but not a view, instead collecting to list using streams:
List<List<E>> grouped = indexed.keySet().stream()
.map(indexed::get)
.collect(Collectors.toList());
编辑2:正如Petr Gladkikh在下面的评论中提到的,如果足够了,上面的例子可以更简单:Collection<List<E>>
Collection<List<E>> grouped = indexed.asMap().values();