java - 使用 Java 8 Streams 为 ArrayList<Double> 输入重写 StringJoiner

标签 java java-stream

我如何使用 Java 8 流重写它?我还不太熟悉 Java 8 功能。

private final ArrayList<Double> ledger = new ArrayList<>();

/**
 *
 * @return the ledger as a String (e.g. "1.20|2.50|1.90")
 */
public String getLedgerString() {
    StringJoiner  sj = new StringJoiner("|","[","]");
    for (double d : ledger)
        sj.add(String.format("%.2f", d));
    return sj.toString();
}

最佳答案

当您的所有信息已自包含在可流式传输列表中时,直接使用字符串连接器并不有效,因为您可以直接流式传输并使用 Collectors.joining 创建字符串。 .

这可以像这样使用:

ledger.stream()
    .map(d->String.format("%.2f", d))
    .collect(
      Collectors.joining("|","[","]")
    );

该方法的 3 个参数与您期望的 StringJoiner 相同。

上面的代码使用.stream()循环遍历List,然后.map()将它们转换为字符串,最后收集它们使用Collectors.joining

Yuri Schimke还建议了另一种方法,您也可以使用DecimalFormat来格式化数字。这可以通过以下方式完成:

ledger.stream()
    .map(new DecimalFormat("0.00")::format)
    .collect(
      Collectors.joining("|","[","]")
    );

它使代码稍微长一些,但优点是您可以轻松地将小数点分隔符更改为其他内容。

关于java - 使用 Java 8 Streams 为 ArrayList<Double> 输入重写 StringJoiner,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35318563/

相关文章:

java - 在并行 Java 流中处理随机数

java - 如何按集合大小总和对 Map<String, List<Set<Long>>> 进行排序?

java - 使用 imap 通过 Java 接收电子邮件抛出连接超时

java - 如何在 Java 中解析或拆分 URL 地址?

java - 使用Maven定制并构建另一个Maven项目

java - 根据源List内容将List转换为List<List>

java - 使用 Streams 将 BigDecimals 相加

java - 将 UTC 时间从 MySQL 转换为本地时区

java - 使用递归从两个链表中查找公共(public)节点

java - 如何在 ImmutableMap 中扁平化 ImmutableList