【问题标题】:How to use StringBuilder with Map如何将 StringBuilder 与 Map 一起使用
【发布时间】:2020-12-07 09:51:09
【问题描述】:

我有一张下面的地图

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 anonymous\n"());
}

问题是如何将 Map 替换为 Map 并在循环内追加?

【问题讨论】:

  • 好吧,只需从值 lambda 创建并返回一个新的 StringBuilder,例如(k,v) -&gt; new StringBuilder(v).append(", from anonymous")。如果您想创建单个 StringBuilder,为什么不直接遍历/流式传输 collections() 并加入值字符串?
  • @Thomas。这意味着我每次都必须在 for 循环中创建一个新的 StringBuilder 吗?并且与不可变字符串没有区别
  • 好吧,实际上现在的字符串连接可能正在使用 StringBuilder 或更高效的实现。

标签: java loops dictionary stringbuilder


【解决方案1】:

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

插图:

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 anonymous\n"));
        }
    }
}

我错过了什么吗?

【讨论】:

    【解决方案2】:

    Map::merge 或集合到映射等方法需要创建额外的 StringBuilder 实例,然后将这些实例连接起来:

    map.merge(
        dto.getType(), 
        new StringBuilder(dto.getName()).append(" from anonymous\n"), // 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 anonymous\n");
    }
    System.out.println(map);
    

    输出:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-20
      • 2022-07-05
      • 2012-11-15
      • 2016-03-29
      • 2018-04-06
      • 2021-08-18
      • 1970-01-01
      相关资源
      最近更新 更多