文章目录
- 1.使用键映射器(`Key Mapper`)和值映射器(`Value Mapper`)将`List`转换`Map`
- 2.使用键映射器(`Key Mapper`)、值映射器(`Value Mapper`)和合并函数(`Merge Function`)将`List`转换`Map`
- 3.使用键映射器(`Key Mapper`)、值映射器(`Value Mapper`)、合并函数(`Merge Function`)和`Map Supplier`将`List`转换`Map`
- 参考文献
在这个页面上,我们将提供List
转换Map
使用Collectors.toMap()
的示例。
使用lambda表达式,我们可以在一行中将List
转换Map
。
Java 8提供Collectors.toMap()
方法,在将List
转换成Map
很有效的。
我们需要传递键和值的映射函数。
为了避免重复键的冲突,我们传递merge
函数,否则它将抛出illeglastateException
。
默认情况下Collectors.toMap()
返回HashMap
,如果要更改它,则需要传递所需的supplier
实例。
toMap()
方法语法。
toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction, Supplier mapSupplier)
参数说明:
-
Function keyMapper
:它用于生成Map
的key
-
Function valueMapper
:它用于生成Map
的value
-
BinaryOperator mergeFunction
:这是可选的。合并功能的可用性是处理重复Map
键的情况。使用BinaryOperator
我们可以合并重复键的值。如果不传递此参数,那么在出现重复键的情况下,默认情况下它将抛出illeglastateException
。 -
Supplier mapSupplier
:这是可选的。它返回一个Map
,其中的数据作为键/值填充。如果我们没有传递Supplier mapSupplier
,那么默认的supplier
将返回HashMap
。如果我们想要其他实例,比如LinkedHashMap
,我们需要将supplier
传递为LinkedHashMap::new
。
1.使用键映射器(Key Mapper
)和值映射器(Value Mapper
)将List
转换Map
这里我们将传递键映射器和值映射器的映射函数。方法的语法如下。
toMap(Function keyMapper, Function valueMapper)
下面是一个简单的例子。
ListToMap1.java
package com.concretepage;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
public class ListToMap1 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Mohan");
list.add("Sohan");
list.add("Mahesh");
Map<String, Object> map = list.stream().collect(Collectors.toMap(Function.identity(), s->s));
map.forEach((x, y) -> System.out.println("Key: " + x +", value: "+ y));
}
输出
Key: Mohan, value: Mohan
Key: Mahesh, value: Mahesh
Key: Sohan, value: Sohan
现在我们有了一个用户类Person
的List
。下面是将List
转换为Map
的代码。
ListToMap2.java
package com.concretepage;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class ListToMap2 {
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
list.add(new Person(100, "Mohan"));
list.add(new Person(200, "Sohan"));
list.add(new Person(300, "Mahesh"));
Map<Integer, String> map = list.stream()
.collect(Collectors.toMap(Person::getId, Person::getName));
map.forEach((x, y) -> System.out.println("Key: " + x +", value: "+ y));
}
}
Person.java
package com.concretepage;
public class Person {
private Integer id;
private String name;
public Person(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public String getName() {
return name;
}
}
输出
Key: 100, value: Mohan
Key: 200, value: Sohan
Key: 300, value: Mahesh
这里如果key
是重复的,它将抛出illeglastateException
。为了解决这个问题,我们将merge
函数作为BinaryOperator
传递。
2.使用键映射器(Key Mapper
)、值映射器(Value Mapper
)和合并函数(Merge Function
)将List
转换Map
在本例中,我们将把BinaryOperator
作为合并函数传递。当toMap()
方法找到重复的键时,这些值将被合并,并且不会引发异常。下面是方法语法。
toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction)
下面是示例
ListToMapWithBinaryOperator.java
package com.concretepage;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class ListToMapWithBinaryOperator {
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
list.add(new Person(100, "Mohan"));
list.add(new Person(100, "Sohan"));
list.add(new Person(300, "Mahesh"));
Map<Integer, String> map = list.stream()
.collect(Collectors.toMap(Person::getId, Person::getName, (x, y) -> x+", "+ y));
map.forEach((x, y) -> System.out.println("Key: " + x +", value: "+ y));
}
}
输出
Key: 100, value: Mohan, Sohan
Key: 300, value: Mahesh
3.使用键映射器(Key Mapper
)、值映射器(Value Mapper
)、合并函数(Merge Function
)和Map Supplier
将List
转换Map
这里我们将通过toMap()
方法传递map supplier
。如果我们想返回LinkedHashMap
,我们需要将map supplier
传递为LinkedHashMap::new
。
toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction, Supplier mapSupplier)
下面是示例
ListToMapWithSupplier.java
package com.concretepage;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.stream.Collectors;
public class ListToMapWithSupplier {
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
list.add(new Person(100, "Mohan"));
list.add(new Person(100, "Sohan"));
list.add(new Person(300, "Mahesh"));
LinkedHashMap<Integer, String> map = list.stream()
.collect(Collectors.toMap(Person::getId, Person::getName,
(x, y) -> x+", "+ y, LinkedHashMap::new));
map.forEach((x, y) -> System.out.println("Key: " + x +", value: "+ y));
}
}
输出
Key: 100, value: Mohan, Sohan
Key: 300, value: Mahesh
参考文献
【1】Java 8 Convert List to Map using Collectors.toMap() Example