Java 8 之 将 Stream 转换为Map

学习使用Java 8 Stream API使用Collectors.toMap()Collectors.groupingBy()方法将 Stream 元素收集到Map中。使用Java Stream API 将 Stream 转换为映射

1.具有唯一映射键的 Stream 元素– Collectors.toMap()

如果 Stream 元素具有唯一的地图关键字字段,那么我们可以Collectors.toMap()用来收集元素以Map<keyObj, Element>轻松地以格式进行地图。

例如,我们可以收集Employee要映射的对象列表,其中员工ID是唯一字段,并使用键来映射条目。

使用 Stream API 将列表转换为映射的 Java 8示例。

独特的地图键
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
public class Main
{
    public static void main(String[] args)
    {
        List<Employee> employeeList = new ArrayList<>(Arrays.asList(
                            new Employee(1"A"100),
                            new Employee(2"A"200),
                            new Employee(3"B"300),
                            new Employee(4"B"400),
                            new Employee(5"C"500),
                            new Employee(6"C"600)));
        
        Map<Long, Employee> employeesMap = employeeList.stream()
                                .collect( Collectors.toMap(Employee::getId,
                                        Function.identity()) );
        
        System.out.println(employeesMap);
    }
}

程序输出。

安慰
{1=Employee [id=1, name=A, salary=100.0],
2=Employee [id=2, name=A, salary=200.0],
3=Employee [id=3, name=B, salary=300.0],
4=Employee [id=4, name=B, salary=400.0],
5=Employee [id=5, name=C, salary=500.0],
6=Employee [id=6, name=C, salary=600.0]}

2.具有重复映射键的 Stream 元素– Collectors.groupingBy()

如果 Stream 元素具有映射键重复的元素,我们可以Collectors.groupingBy()用来收集元素以Map<keyObj, List<Element>>格式映射。在这里,对于每个映射键,我们将所有元素存储在列表中作为映射值。

例如,我们可以收集Employee要映射的对象列表,在该列表中,员工名称可能是某些 Stream 元素的重复字段。在这种情况下,所有具有相同名称的员工都将存储在一个列表中,并且该列表将存储为地图值字段。

使用 Stream API 将列表转换为列表映射的 Java 8示例。

重复的地图键
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main
{
    public static void main(String[] args)
    {
        List<Employee> employeeList = new ArrayList<>(Arrays.asList(
                            new Employee(1"A"100),
                            new Employee(2"A"200),
                            new Employee(3"B"300),
                            new Employee(4"B"400),
                            new Employee(5"C"500),
                            new Employee(6"C"600)));
        
        Map<String, List<Employee>> employeesMap = employeeList.stream()
                                .collect(Collectors.groupingBy(Employee::getName));
        
        System.out.println(employeesMap);
    }
}

程序输出。

安慰
{A=[Employee [id=1, name=A, salary=100.0], Employee [id=2, name=A, salary=200.0]],
 B=[Employee [id=3, name=B, salary=300.0], Employee [id=4, name=B, salary=400.0]],
 C=[Employee [id=5, name=C, salary=500.0], Employee [id=6, name=C, salary=600.0]]}

3.结论

事先知道Stream元素对于地图关键字字段是否具有不同的值非常重要。如果映射键重复并且我们使用Collectors.toMap()方法,则将获得IllegalStateException

错误
Exception in thread "main" java.lang.IllegalStateException: Duplicate key Employee [id=5, name=C, salary=500.0]
    at java.util.stream.Collectors.lambda$throwingMerger$106(Collectors.java:133)
    at java.util.str

saigon has written 1445 articles

Leave a Reply