将List <T>转换为带有元素列表的Map(Map <F <T>,List <T >>)Java 7

ant*_*oho 2 java dictionary list guava

我发现了一种改造的方法,List<Object> to a Map<Integer, Object>但我需要

List<Object> to Map<Integer, List<Object>
Run Code Online (Sandbox Code Playgroud)

比如我上课了

class Movie {
   public int rank;
   public String desc;

   public Movie(int rank, String desc) {
        this.rank = rank;
        this.desc = desc;
   }
}
Run Code Online (Sandbox Code Playgroud)

并列出:

    List<Movie> movies = new ArrayList<Movie>();
    movies.add(new Movie(1, "The Movie 0"));
    movies.add(new Movie(2, "The Movie 1"));
    movies.add(new Movie(2, "The Movie 2"));
Run Code Online (Sandbox Code Playgroud)

我想要的是每个等级的列表地图..

List<Movie> -> Map<Integer (rank), List<Movie>>
Run Code Online (Sandbox Code Playgroud)

与番石榴我可以做这样的简单转换

Map<Integer,Movie> mappedMovies = Maps.uniqueIndex(movies, new Function <Movie,Integer> () {
    public Integer apply(Movie from) {
        return from.getRank(); 
}});
Run Code Online (Sandbox Code Playgroud)

但不是 Map<Integer, List<Movie>>

我只能在关于它的帖子上找到

Java:如何从List <T>转换为Map <f1(T),List(f2(T))>而无需迭代

然而,一种方法是使用Java 8和第二种方法出于某种原因返回 ListMultimap<Integer, String>

mfu*_*n26 5

你提到的第二种方法是你想要的.正如Kiskae 评论的那样," ListMultimap<K,V>本质上是一个Map<K,List<V>>管理为你创建列表的人".

因此,您可以使用Multimaps.index(Iterable, Function)Multimaps.asMap(ListMultimap)获得Map<F<T>, List<T>>:

ImmutableListMultimap<Integer, Movie> index = Multimaps.index(movies, new Function<Movie, Integer>() {
    @Override
    public Integer apply(Movie from) {
        return from.getRank();
    }
});
Map<Integer, List<Movie>> map = Multimaps.asMap(index);
Run Code Online (Sandbox Code Playgroud)

虽然你可以使用Multimaps.asMap(ListMultimap)它可能更容易Multimap直接使用.有关详细信息,请参阅NewCollectionTypesExplained·google/guava WikiMultimap部分.