Java - 在Lambda表达式中向字符串添加内容

8

我对Java还很陌生,我尝试在StackOverflow/谷歌搜索,但没有找到解决我的问题的答案。

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

这是我的代码:

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

那么你有什么问题? - Codo
2个回答

9
直接使用一个String变量这样是不可能的,因为lambda外部变量必须是(有效的)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();
}

谢谢,这正是我所需要的。 - Cake
跟进问题。这真的是我能做到的最短的吗?public String toString() { StringBuilder s = new StringBuilder(); s.append("在班级 "); s.append(this.klasCode); s.append(" 中有以下学生:\n"); deLeerlingen.forEach(leerlingen -> { s.append(leerlingen.toString()); s.append("\n"); }); return s.toString(); - Cake
你可以使用构造者模式并使用 append,如 b.append("").append("").append("");,或者在 forEach 中使用方法引用而不是显式 lambda: deLeerlingen.forEach(b::append);。但这只是语法糖 - 我怀疑它不会使代码执行更快。使用你最能读懂和理解的版本。 - flo

4
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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接