以下是将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。