2016-02-10 26 views
0

如何使用Java 8流重写此操作?我还没有真正熟悉Java 8的功能。使用Java 8 Streams为ArrayList重写StringJoiner <Double>输入

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(); 
} 

回答

6

直接使用一个stringjoiner是不是有效的,当你有包含在流化列表中的所有您的信息已经自己,因为你可以直接流和创建一个字符串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("|","[","]") 
    ); 

它使代码稍长,但具有的优点是,你可以很容易地改变小数点分隔别的东西。

+0

很好,谢谢 - 让我的代码看起来肯定干净。感谢您解释它。 – ycomp

+0

我不确定使用'Collectors.joining'比'for'循环更有效(也许如果有很多元素的话),但它绝对更干净。 – Tunaki

+0

您可以使用的另一个调整是使用“.map(新的DecimalFormat(”0.00“):: format)”,这可能比每次调用静态格式方法便宜一点。 TIOLI。 –

0

下面是一个简单的例子:

private static void joiningTest() { 
    List<String> strs = Arrays.asList("one", "two", "three"); 
    String str = strs.stream().collect(Collectors.joining(":","[","]")); 
    System.out.println(str); 
} 

输出将是:

[one:two:three] 
相关问题