streamlist转map

以下是将Stream列表转换为Map的示例代码:

List<String> list = Arrays.asList("apple", "banana", "cherry", "date");

// 将列表转换为Map,键为字符串的第一个字母,值为字符串本身
Map<Character, String> map = list.stream()
        .collect(Collectors.toMap(s -> s.charAt(0), s -> s));

System.out.println(map); // 输出:{a=apple, b=banana, c=cherry, d=date}

在上面的示例中,我们使用Collectors.toMap()方法将Stream列表转换为Map。该方法接受两个参数:一个用于提取键的函数,另一个用于提取值的函数。在本例中,我们使用s -> s.charAt(0)作为键提取函数,它返回字符串的第一个字母;使用s -> s作为值提取函数,它返回字符串本身。最终,我们得到一个键为字符串的第一个字母,值为字符串本身的Map。

当Stream中的元素是对象时,我们可以使用对象的某个属性作为Map的键,对象本身作为Map的值。例如,假设我们有一个Person类:

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

我们可以使用该类的name属性作为Map的键,Person对象本身作为Map的值:

List<Person> people = Arrays.asList(
        new Person("Alice", 25),
        new Person("Bob", 30),
        new Person("Charlie", 35),
        new Person("David", 40)
);

// 将列表转换为Map,键为Person对象的name属性,值为Person对象本身
Map<String, Person> map = people.stream()
        .collect(Collectors.toMap(Person::getName, Function.identity()));

System.out.println(map);

输出结果为:

{Alice=Person{name='Alice', age=25}, Bob=Person{name='Bob', age=30}, Charlie=Person{name='Charlie', age=35}, David=Person{name='David', age=40}}

在上面的示例中,我们使用Person::getName作为键提取函数,它返回Person对象的name属性;使用Function.identity()作为值提取函数,它返回Person对象本身。最终,我们得到一个键为Person对象的name属性,值为Person对象本身的Map。