ecSpecificationDetailVoList.stream().collect(HashMap::new, (m, v) -> m.put(v.getSkuId(), v), HashMap::putAll);
时间: 2024-03-29 18:37:32 浏览: 29
这是一个 Java 8 中使用 Stream 流操作的代码,其作用是将一个 List 中的对象转化为一个 HashMap,其中 List 中的每个对象都有一个唯一的 skuId 属性用于作为 HashMap 的 key。具体来说,代码中的几个参数含义如下:
- ecSpecificationDetailVoList:原始的 List 对象。
- HashMap::new:用于创建一个新的空 HashMap 的构造器方法引用。
- (m, v) -> m.put(v.getSkuId(), v):用于将 List 中的每个对象插入到 HashMap 中的 BiConsumer 对象。
- HashMap::putAll:用于将多个 HashMap 合并成一个的方法引用。
整个操作的结果是返回一个新的 HashMap 对象,其中每个对象的 skuId 属性对应着 List 中对应的对象。
相关问题
优化这段代码:List<CompletableFuture<Map<String, Object>>> futureList = new ArrayList<>(); for (PersonBasicVo person : personList) { CompletableFuture<Map<String, Object>> future = CompletableFuture.supplyAsync(() -> { String personNo = person.getPersonNo(); List<ContactsBasic> contactsList = contactsService.list(Wrappers.lambdaQuery(ContactsBasic.class) .eq(ContactsBasic::getPersonNo, personNo) .ne(ContactsBasic::getRelationshipAccount, "") .isNotNull(ContactsBasic::getPersonNo) .like(StrUtil.isNotBlank(phone), ContactsBasic::getRelationshipAccount, phone)); if (CollUtil.isNotEmpty(contactsList)) { Map<String, Object> contactsMap = new HashMap<>(); contactsMap.put("personNo", personNo); contactsMap.put("contactsList", contactsList); return contactsMap; } else { return null; } }, executor); futureList.add(future); } List<Map<String, Object>> contactsMapList = futureList.stream() .map(CompletableFuture::join) .filter(Objects::nonNull) .collect(Collectors.toList());
优化后的代码如下:
```java
List<CompletableFuture<Map<String, Object>>> futureList = personList.stream()
.map(person -> CompletableFuture.supplyAsync(() -> {
String personNo = person.getPersonNo();
List<ContactsBasic> contactsList = contactsService.list(Wrappers.lambdaQuery(ContactsBasic.class)
.eq(ContactsBasic::getPersonNo, personNo)
.ne(ContactsBasic::getRelationshipAccount, "")
.isNotNull(ContactsBasic::getPersonNo)
.like(StrUtil.isNotBlank(phone), ContactsBasic::getRelationshipAccount, phone));
if (CollUtil.isNotEmpty(contactsList)) {
Map<String, Object> contactsMap = new HashMap<>();
contactsMap.put("personNo", personNo);
contactsMap.put("contactsList", contactsList);
return contactsMap;
} else {
return null;
}
}, executor))
.collect(Collectors.toList());
List<Map<String, Object>> contactsMapList = futureList.stream()
.map(CompletableFuture::join)
.filter(Objects::nonNull)
.collect(Collectors.toList());
```
主要优化:
1. 使用流式编程,替换原来的for循环。
2. 使用`stream()`和`collect(Collectors.toList())`方法来收集结果,代替手动添加到列表中。
3. 将lambda表达式内联,使代码更简洁。
java中Collectors.toMap中的key::、value::如何进行再次封装
`key::` 和 `value::` 是 Java 8 中的方法引用,用于将 lambda 表达式中的参数作为方法的参数传递。如果需要对其进行再次封装,可以使用 lambda 表达式或方法引用的方式。
例如,我们可以使用 lambda 表达式对 `key::` 进行再次封装:
```java
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
// 使用 lambda 表达式对 key 进行再次封装
Map<String, Integer> result = map.entrySet().stream()
.collect(Collectors.toMap(entry -> "prefix_" + entry.getKey(), Map.Entry::getValue));
System.out.println(result); // 输出:{prefix_a=1, prefix_b=2, prefix_c=3}
```
同样地,我们也可以使用方法引用对 `value::` 进行再次封装:
```java
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
// 使用方法引用对 value 进行再次封装
Map<String, String> result = map.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, entry -> "prefix_" + entry.getValue()));
System.out.println(result); // 输出:{a=prefix_1, b=prefix_2, c=prefix_3}
```