当前位置: 首页 > 知识库问答 >
问题:

我们已经有了StringBuilder,为什么还要用StringJoiner?

慕容俭
2023-03-14

我最近遇到了一个Java8类StringJoiner,它使用分隔符添加字符串并为其添加前缀和后缀,但我不明白这个类的需要,因为它也使用StringBuilder在后端,也执行非常简单的附加字符串操作。

我是否因为没有真正理解这门课的真正目的而错过了什么?

共有3个答案

桂玉石
2023-03-14

在某些用例中,它可能会简化您的代码:

List<String> list = // ...;

// with StringBuilder
StringBuilder builder = new StringBuilder();
builder.append("[");
if (!list.isEmpty()) {
    builder.append(list.get(0));
    for (int i = 1, n = list.size(); i < n; i++) {
        builder.append(",").append(list.get(i));
    }
}
builder.append("]");

// with StringJoiner
StringJoiner joiner = new StringJoiner(",", "[", "]");
for (String element : list) {
    joiner.add(element);
}
孙阳旭
2023-03-14

StringJoiner Javadoc上的例子很好地涵盖了这一点。整个要点是将分隔符的选择从添加条目的行为中抽象出来。例如,你可以创建一个joiner,指定要使用的分隔符,并将其传递给一个库来添加元素,反之亦然。

字符串“[George:Sally:Fred]”可以构造如下:

StringJoiner sj = new StringJoiner(":", "[", "]");
sj.add("George").add("Sally").add("Fred");
String desiredString = sj.toString();

StringJoiner可用于使用Collector.join(CharSequence)从流创建格式化输出。例如:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
String commaSeparatedNumbers = numbers.stream()
    .map(i -> i.toString())
    .collect(Collectors.joining(", "));
澹台成龙
2023-03-14

当您需要连接< code >流中的字符串时,< code>StringJoiner非常有用。

举个例子,如果您有以下字符串列表:

final List<String> strings = Arrays.asList("Foo", "Bar", "Baz");

使用起来要简单得多

final String collectJoin = strings.stream().collect(Collectors.joining(", "));

就像<code>StringBuilder</code>一样:

final String collectBuilder =
    strings.stream().collect(Collector.of(StringBuilder::new,
        (stringBuilder, str) -> stringBuilder.append(str).append(", "),
        StringBuilder::append,
        StringBuilder::toString));

6年后编辑正如评论中提到的,现在有更简单的解决方案,如String.join (", ", 字符串),这些解决方案在当时是不可用的。但是用例仍然是一样的。

 类似资料:
  • 问题内容: 我最近遇到了一个Java 8类,该类使用定界符添加String并向其添加前缀和后缀,但是我无法理解此类的需要,因为它也在后端使用,并且执行非常简单的附加操作字符串。 我是否没有真正理解本堂课的真正目的而错过了某些东西? 问题答案: 当您需要在中将Strings连接时,此功能非常有用。 例如,如果您必须遵循以下字符串列表: 使用起来更简单 就像使用: 六年后编辑 如评论中所述,现在有许多

  • 问题内容: 我想知道一个仅在Eclipse上使用Maven或Ant的具体示例。 当我在Eclipse中进行开发时,Eclipse会为我做所有事情,而我只需要单击run按钮。而且,Eclipse可以让您将代码导出到Windows的可运行jar或.exe中。 所以我真的不知道为什么我需要Maven或Ant。 而且,如果确实需要, 我应该选择Maven还是Ant? 问题答案: 因为您的同事可能更喜欢Ne

  • 问题内容: 我开始使用RxJS,但我不明白为什么在此示例中我们需要使用类似or 的函数;数组的数组在哪里? 如果有人可以直观地解释正在发生的事情,那将非常有帮助。 问题答案: 当您有一个Observable的结果是更多Observable时,可以使用flatMap。 如果您有一个由另一个可观察对象产生的可观察对象,则您不能直接过滤,缩小或映射它,因为您有一个可观察对象而不是数据。如果您生成一个可观

  • 问题内容: 我刚开始,最近经历了一个ODM框架。 在文档上,我找不到为什么需要使用。我可以给出的一个原因是,我们可以从定义应用程序架构。 我正在寻找更多可能的原因,以及吸引我使用的需求。 请列出所有可能的优点和使用理由/需要。 问题答案: 主要优势是相对于纯mongo的抽象。 来自SQL数据库类型的许多开发人员对于使用未定义结构的动态集合感到非常不舒服。因此, 模式 首先可以帮助您。 此外,它实现

  • public class Driver extends NonRegisteringDriver implements java.sql.Driver public class NonRegisteringDriver implements Driver 是为了规范吗?

  • 据我所知,maven引入了依赖项。但是,如果我已经把依赖的罐子拉进去一次,并把它们放在git中,为什么我需要maven呢? 即使有多个开发人员,一旦依赖项在git中,每个开发人员在拉git回购时都会得到所有的依赖项,那么哪里需要maven呢? 我知道这个问题可能被认为是“基于意见的”,但是我试图理解如果依赖项已经在源代码控制中,maven提供了什么优势。 编辑:我说的是固定的,第三方依赖,如泽西,