List轉Map
阿新 • • 發佈:2022-04-13
1、傳統方法
public Map<Integer, Animal> convertListBeforeJava8(List<Animal> list) { Map<Integer, Animal> map = new HashMap<>(); for (Animal animal : list) { map.put(animal.getId(), animal); } return map; }
2、stream
public Map<Integer, Animal> convertListAfterJava8(List<Animal> list) { Map<Integer, Animal> map = list.stream() .collect(Collectors.toMap(Animal::getId, Function.identity())); return map; }
3、Guava庫
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.0.1-jre</version> </dependency> publicMap<Integer, Animal> convertListWithGuava(List<Animal> list) { Map<Integer, Animal> map = Maps .uniqueIndex(list, Animal::getId); return map; }
4、Apache Commons庫
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.4</version> </dependency> publicMap<Integer, Animal> convertListWithApacheCommons2(List<Animal> list) { Map<Integer, Animal> map = new HashMap<>(); MapUtils.populateMap(map, list, Animal::getId); return map; }
key衝突情況
Apache Commons 和 Java 8 之前的程式碼是一樣的,相同id的Map 在put 的時候會進行覆蓋。
而 Java 8 的 Collectors.toMap() 和 Guava 的 MapUtils.populateMap() 分別丟擲 IllegalStateException 和 IllegalArgumentException。