stream().collect(Collectors.toMap
时间: 2023-11-17 21:04:19 浏览: 100
`stream().collect(Collectors.toMap())`是Java 8中的一个方法,它可以将一个流转换为一个Map对象。该方法需要两个参数:一个是用于生成Map键的函数,另一个是用于生成Map值的函数。下面是一个例子:
假设我们有一个Person类,其中包含id和name两个属性。我们想将一个Person列表转换为一个Map,其中id是键,name是值。可以使用以下代码:
```java
List<Person> personList = new ArrayList<>();
personList.add(new Person(1, "Alice"));
personList.add(new Person(2, "Bob"));
personList.add(new Person(3, "Charlie"));
Map<Integer, String> personMap = personList.stream()
.collect(Collectors.toMap(Person::getId, Person::getName));
System.out.println(personMap);
```
输出结果为:`{1=Alice, 2=Bob, 3=Charlie}`
在上面的代码中,`Person::getId`和`Person::getName`是方法引用,用于生成Map的键和值。`toMap()`方法将这些键值对收集到一个Map中。
相关问题
stream.collect(Collectors.tomap(pk -> ))方法
`stream.collect(Collectors.toMap(pk -> keyExtractor, valueExtractor))` 是Java 8 Stream API中用于收集数据并转换为映射(map)的一个常用方法。它将流中的元素转换成键值对,并通过提供的两个函数分别提取每个元素的关键字(key)和值(value)。
- `pk -> keyExtractor` 这部分是一个Lambda表达式,`pk`通常代表流中的每个元素,`keyExtractor`是你自定义的函数,负责从该元素中抽取作为新map键的部分。
- `valueExtractor` 同样也是一个Lambda表达式,用于从元素中抽取作为新map值的部分。
这个方法适用于需要按某种规则将元素组织成映射的情况,比如从列表中按照某个属性创建一个新的键值对集合。例如,如果你有一个学生列表,你可以使用此方法根据学生的ID获取他们的姓名:
```java
List<Student> students = ...;
Map<Integer, String> studentNames = students.stream()
.collect(Collectors.toMap(Student::getId, Student::getName));
```
在这里,`getId` 和 `getName` 分别是`keyExtractor` 和 `valueExtractor`,它们从`Student`对象中提取ID和姓名。
Map<Long, String> idMap = list.stream().collect(Collectors.toMap(EntryDeliveryBillMaterialUpdateBatchNoVO::getId, EntryDeliveryBillMaterialUpdateBatchNoVO::getBatchNo)); Map<Long,Date> dateMap = list.stream().collect(Collectors.toMap(EntryDeliveryBillMaterialUpdateBatchNoVO::getId, EntryDeliveryBillMaterialUpdateBatchNoVO::getProduceDate));怎么转成一个map
要将这两个 `Map` 合并为一个,可以使用 `Stream` 的 `collect` 方法,结合 `Collectors.toMap` 和 lambda 表达式来实现。具体代码如下:
```
Map<Long, Map<String, Object>> resultMap = list.stream().collect(Collectors.toMap(
EntryDeliveryBillMaterialUpdateBatchNoVO::getId,
vo -> {
Map<String, Object> subMap = new HashMap<>();
subMap.put("batchNo", vo.getBatchNo());
subMap.put("produceDate", vo.getProduceDate());
return subMap;
},
(map1, map2) -> {
map1.putAll(map2);
return map1;
}
));
```
上述代码中,使用 `Collectors.toMap` 将 `idMap` 和 `dateMap` 合并为一个 `Map`,其中 `EntryDeliveryBillMaterialUpdateBatchNoVO::getId` 作为 `keyMapper`,返回 `id` 作为 `key`;lambda 表达式 `vo -> {...}` 作为 `valueMapper`,返回一个包含 `batchNo` 和 `produceDate` 的子 `Map` 作为 `value`。由于 `Map` 的 `merge` 方法只能用于合并相同类型的 `Map`,所以在合并时需要提供一个 `mergeFunction`,将两个子 `Map` 合并为一个。这里使用的是 `(map1, map2) -> {...}` lambda 表达式,将两个子 `Map` 中的所有键值对合并到第一个子 `Map` 中,然后返回第一个子 `Map`。
阅读全文