Java 三种将list转换为map的方法详解

 

在本文中,介绍三种将list转换为map的方法:

1) 传统方法

假设有某个类如下 

class Movie { 
    
  private Integer rank; 
  private String description; 
    
  public Movie(Integer rank, String description) { 
    super(); 
    this.rank = rank; 
    this.description = description; 
  } 
    
  public Integer getRank() { 
    return rank; 
  } 
  
  public String getDescription() { 
    return description; 
  } 
  
  @Override
  public String toString() { 
    return Objects.toStringHelper(this) 
        .add("rank", rank) 
        .add("description", description) 
        .toString(); 
  } 
} 

    使用传统的方法: 

@Test
public void convert_list_to_map_with_java () { 
    
  List<Movie> movies = new ArrayList<Movie>(); 
  movies.add(new Movie(1, "The Shawshank Redemption")); 
  movies.add(new Movie(2, "The Godfather")); 
  
  Map<Integer, Movie> mappedMovies = new HashMap<Integer, Movie>(); 
  for (Movie movie : movies) { 
    mappedMovies.put(movie.getRank(), movie); 
  } 
    
  logger.info(mappedMovies); 
  
  assertTrue(mappedMovies.size() == 2); 
  assertEquals("The Shawshank Redemption", mappedMovies.get(1).getDescription()); 
} 

2) JAVA 8直接用流的方法:   

@Test
public void convert_list_to_map_with_java8_lambda () { 
    
  List<Movie> movies = new ArrayList<Movie>(); 
  movies.add(new Movie(1, "The Shawshank Redemption")); 
  movies.add(new Movie(2, "The Godfather")); 
  
  Map<Integer, Movie> mappedMovies = movies.stream().collect( 
      Collectors.toMap(Movie::getRank, (p) -> p)); 
  
  logger.info(mappedMovies); 
  
  assertTrue(mappedMovies.size() == 2); 
  assertEquals("The Shawshank Redemption", mappedMovies.get(1).getDescription()); 
} 

3) 使用guava 工具类库 

@Test
public void convert_list_to_map_with_guava () { 
  
    
  List<Movie> movies = Lists.newArrayList(); 
  movies.add(new Movie(1, "The Shawshank Redemption")); 
  movies.add(new Movie(2, "The Godfather")); 
    
    
  Map<Integer,Movie> mappedMovies = Maps.uniqueIndex(movies, new Function <Movie,Integer> () { 
     public Integer apply(Movie from) { 
      return from.getRank();  
  }}); 
    
  logger.info(mappedMovies); 
    
  assertTrue(mappedMovies.size() == 2); 
  assertEquals("The Shawshank Redemption", mappedMovies.get(1).getDescription()); 
} 

 

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java 8中的Collectors.toMap方法可以将Stream中的元素转换为一个Map对象。该方法有三个参数:keyMapper,valueMapper和mergeFunction。其中,keyMapper用于将Stream中的元素转换Map的key,valueMapper用于将Stream中的元素转换Map的value,mergeFunction用于处理当key重复时的冲突情况。 下面是一个例子,假设我们有一个List对象,其中包含多个Person对象,每个Person对象都有一个唯一的id属性和一个name属性。我们可以使用Collectors.toMap方法List转换为一个以id为key,以Person对象为value的Map对象: ```java List<Person> personList = new ArrayList<>(); // 假设我们已经将多个Person对象添加到了personListMap<Integer, Person> personMap = personList.stream() .collect(Collectors.toMap(Person::getId, Function.identity())); ``` 在上面的例子中,Person::getId表示将Person对象的id属性作为Map的key,Function.identity()表示将Person对象本身作为Map的value。如果我们想要将Person对象的name属性作为Map的value,可以这样写: ```java Map<Integer, String> personMap = personList.stream() .collect(Collectors.toMap(Person::getId, Person::getName)); ``` 如果我们的List中有重复的id,那么上面的代码将会抛出IllegalStateException异常。为了避免这种情况,我们可以使用mergeFunction参数来处理冲突。例如,如果我们想要将重复的id的Person对象合并为一个List,可以这样写: ```java Map<Integer, List<Person>> personMap = personList.stream() .collect(Collectors.toMap(Person::getId, Collections::singletonList, (list1, list2) -> { List<Person> resultList = new ArrayList<>(list1); resultList.addAll(list2); return resultList; })); ``` 在上面的代码中,Collections::singletonList表示将Person对象转换为只包含一个元素的List,mergeFunction参数则表示将两个List合并为一个List

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值