使用Java 8 Streams重写StringJoiner以获取ArrayList <Double>输入

yco*_*omp 0 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();
}
Run Code Online (Sandbox Code Playgroud)

Fer*_*big 6

如果您已将所有信息自包含在可流式列表中,则直接使用stringjoiner无效,因为您可以直接流式传输并创建一个字符串Collectors.joining.

这可以像:

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

该方法的3个参数与您对a的预期相同StringJoiner.

上面的代码使用.stream()循环在List随后.map()他们字符串,然后最后用收集它们Collectors.joining.

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

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

它使代码稍长,但具有的优点是您可以轻松地将小数分隔符更改为其他内容.