【问题标题】:Java - Add to a string within a Lambda expressionJava - 添加到 Lambda 表达式中的字符串
【发布时间】:2016-06-23 20:31:49
【问题描述】:

我对 Java 很陌生,我尝试在 StackOverflow/Google 上四处寻找,但找不到问题的答案。

问题:我有一个名为“s”的字符串,我已将其设置为一个句子。 然后,我想使用 Lambda .forEach 循环遍历对象列表,从对象中检索 toString() 并将其添加到 this 's' String。

这是我的代码:

public String toString() {
    String s =  "In klas " + this.klasCode + " zitten de volgende leerlingen:\n";
    deLeerlingen.forEach(leerlingen -> {
        s += leerlingen.toString();
    });
    return s;
}

【问题讨论】:

  • 那么你的问题是什么?

标签: java foreach lambda


【解决方案1】:

以这种方式直接使用 String 变量是不可能的,因为 lambda 外部变量必须是 (effectively) final。

您可以改用StringBuilder:

public String toString() {
    StringBuilder b = new StringBuilder();

    b.append("In klas ");
    b.append(this.klasCode);
    b.append(" zitten de volgende leerlingen:\n");

    deLeerlingen.forEach(leerlingen -> {
        b.append(leerlingen.toString());
    });

    return b.toString();
}

【讨论】:

  • 谢谢,这正是我需要的。
  • 跟进问题。这真的是我能做到的最短的吗?: public String toString() { StringBuilder s = new StringBuilder(); s.append("在 klas 中"); s.append(this.klasCode); s.append(" zitten de volgende leerlingen:\n"); deLeerlingen.forEach(leerlingen -> { s.append(leerlingen.toString()); s.append("\n"); });返回 s.toString(); (抱歉,不知道怎么把它变成code-formatted)
  • 您可以利用构建器模式并使用append 就像b.append("").append("").append(""); 或者您可以使用forEach 中的方法引用而不是显式的lambda:deLeerlingen.forEach(b::append);。但这只是语法糖——我怀疑它会使代码执行得更快。使用您最容易阅读和理解的版本。
【解决方案2】:
public String toString() {
    String s =  "In klas " + this.klasCode + " zitten de volgende leerlingen:\n";
    String list = deLeerlingen.stream()
         .map(Object::toString)
         .collect(Collectors.joining());
    return s + list;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    相关资源
    最近更新 更多