文章目录

  • 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:它用于生成Mapkey
  • Function valueMapper:它用于生成Mapvalue
  • 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

现在我们有了一个用户类PersonList。下面是将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 SupplierList转换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