我可以这样做:
Map<Long, MyBean> mappedbean = Maps.uniqueIndex(myBeanList, toId);
,其中
private final Function<BeanWithId, Long> toId=
new Function<BeanWithId, Long>() {
public Long apply(BeanWithId beanWithId) {
return beanWithId.getId();
}
};
但是我如何创建一个子列表地图,如下所示:
Map<Long, List<MyBean>> mappedbean = Maps.somethingSomething(myBeanList, toId);
其中id不是bean上的唯一标识符。
一个无聊的旧 for loop ?
答案 0 :(得分:2)
我不会使用Guava,但Java 8的Stream
API:
import static java.util.stream.Collectors.groupingBy;
final Map<Long, List<MyBean>> mappedbean = myBeanList.stream()
.collect(groupingBy(MyBean::getId));
使用番石榴,你可以做到:
final Map<Long, Collection<MyBean>> mappedbean = Multimaps.index(myBeanList, toId).asMap();
虽然Multimaps.index
会从documentation for ListMultiMap
:
ImmutableListMultimap
返回的地图的值保证为List类型。要使用更具体的通用类型
Map<K, List<V>>
获取此地图,请改为调用Multimaps.asMap(ListMultimap)
。
所以对Map<Long, List>
的演员总是安全的,事实上你可以这样做:
final Map<Long, List<MyBean>> mappedbean = Multimaps.asMap(Multimaps.index(myBeanList, toId));
获取您想要的确切类型。 (感谢@Xaerxess提示)