stream流中map方法和conllect(Collectors.toMap)的区别
在Java 8中,Stream提供了一种操作方式,可以对集合中的元素进行转换、过滤、排序等操作,其中map方法就是一种转换操作,它可以将一个元素映射为另一个元素。
collect(Collectors.toMap)是Stream提供的一种终止操作,它可以将Stream中的元素收集到一个Map中。通常情况下,我们可以使用map操作将集合中的元素转换为Map中的key-value形式,然后再使用collect(Collectors.toMap)将转换后的元素收集到一个Map中。
需要注意的是,map方法只是对元素进行转换,它不会对集合本身进行修改,也不会生成新的集合。而collect(Collectors.toMap)操作会生成一个新的Map集合,其中包含了转换后的元素。
此外,在使用collect(Collectors.toMap)操作时,还需要注意一些问题,例如如果集合中存在重复的key,那么就需要提供一个合适的合并函数来处理这种情况,否则程序会抛出异常。而map方法则不需要考虑这些问题,它只是一种简单的转换操作。
collect方法配合工具类Collectors.toList或者Collectors.toSet或者Collectors.toMap方法,可完成Stream流的数据获取
collect方法是Java Stream API中的重要函数,它允许你在单一流程操作完成后收集数据并转换成特定的形式。当你需要将流中的元素聚集到列表(List)、集合(Set)或映射(Map)中,可以使用 Collectors.toList()、Collectors.toSet() 或 Collectors.toMap() 等工具类。
Collectors.toList(): 这个工具类用于将流中的所有元素收集到一个List中,元素的顺序通常是按照它们在流中出现的顺序保留的,如果需要有序列表,可以传递一个Comparator作为参数。
Collectors.toSet(): 该工具会创建一个不可变的Set,自动去除重复元素,适合于不需要顺序并且不允许重复值的情况。
Collectors.toMap(): 这个工具用于创建一个Map,键和值通常由流中的元素提供。默认情况下,如果键已经存在,旧值会被替换;也可以选择抛出异常(如IllegalStateException)或使用合并策略(如HashMap的putIfAbsent)处理冲突。
使用collect方法的基本语法如下:
List<String> list = streamOfElements.collect(Collectors.toList());
Set<String> set = streamOfElements.collect(Collectors.toSet());
Map<KeyType, ValueType> map = streamOfElements.collect(Collectors.toMap(Function.identity(), Function.identity()));
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
。
相关推荐
















