ecSpecificationDetailVoList.stream().collect(HashMap::new, (m, v) -> m.put(v.getSkuId(), v), HashMap::putAll);
时间: 2024-03-29 21:37:32 浏览: 115
这是一个 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表达式内联,使代码更简洁。
Map<String, String> map = new HashMap<>(); map.put("a", "A"); map.put("b", "B"); List<AA> list = Arrays.asList( new AA("1", "a"), new AA("b", "b"), new AA("1", "c"), new AA("1", "d")); Map<String, List<String>> typeMap = list.stream().collect(Collectors.groupingBy(AA::getName, Collectors.mapping(o -> map.get(o.getNum()), Collectors.toList()))); typeMap.forEach((k, v) -> System.out.println(k + ":::" + v)); 会出现null在List集合中
在这段代码中,如果 `map` 中不存在某个 `AA` 对象的 `num` 对应的值,那么 `Collectors.mapping(o -> map.get(o.getNum()), Collectors.toList())` 返回的结果是 `null`,因此在 `typeMap` 中会出现 `null` 值。
为了避免出现 `null` 值,可以在 `mapping` 中使用 `Optional` 类型来处理可能返回 `null` 的情况。例如:
```
Collectors.mapping(o -> Optional.ofNullable(map.get(o.getNum())).orElse(""), Collectors.toList())
```
这样,如果 `map.get(o.getNum())` 返回 `null`,则将默认值 `""` 作为结果。
阅读全文