如何将 StringBuilder 与 Map 一起使用



>我有以下地图

Map<String, String> map = new HashMap<>();

和收集 dto

List<MyDto> dtoCollection = new ArrayList<>();

class MyDto {
String type;
String name;
}
for(MyDto dto : dtoCollection) {
map.compute(dto.getType(), (key,value) -> value + ", from anonymousn"());
}

问题是如何将 Map<String、String>替换为 Map<String、StrinBuilder>并在循环内追加?

您可以简单地将value + ", from anonymousn"替换为value == null ? new StringBuilder(dto.getName()) : value.append(", from anonymousn"))

插图:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class MyDto {
String type;
String name;
public MyDto(String type, String name) {
this.type = type;
this.name = name;
}
public String getType() {
return type;
}
public String getName() {
return name;
}
}
public class Main {
public static void main(String[] args) {
Map<String, StringBuilder> map = new HashMap<>();
List<MyDto> dtoCollection = new ArrayList<>();
for (MyDto dto : dtoCollection) {
map.compute(dto.getType(), (key, value) -> value == null ? new StringBuilder(dto.getName())
: value.append(", from anonymousn"));
}
}
}

我错过了什么吗?

诸如Map::merge或集合到映射之类的方法需要创建额外的 StringBuilder 实例,然后应该连接这些实例:

map.merge(
dto.getType(), 
new StringBuilder(dto.getName()).append(" from anonymousn"), // redundant StringBuilder
(v1, v2) -> v1.append(v2) // merging multiple string builders
);

当映射中缺少StringBuilder实例时,可以使用computeIfAbsent仅创建一个实例,然后调用append现有值:

Map<String, StringBuilder> map = new HashMap<>();
List<MyDto> dtoCollection = Arrays.asList(
new MyDto("type1", "aaa"), new MyDto("type2", "bbb"), 
new MyDto("type3", "ccc"), new MyDto("type1", "aa2"));
for (MyDto dto : dtoCollection) {
map.computeIfAbsent(dto.getType(), (key) -> new StringBuilder()) // create StringBuilder if needed
.append(dto.getName()).append(" from anonymousn");
}
System.out.println(map);

输出:

{type3=ccc from anonymous
, type2=bbb from anonymous
, type1=aaa from anonymous
aa2 from anonymous
}

最新更新