如何根据数量从java8中的列表中连接字符串元素?

ran*_*er1 2 java-8

我有以下结构:

class MyClass {
    String name;
    String descr;

    public String getName() {
        return name;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我有一个这些对象的列表,如果列表包含任何这些元素,我想从上面的对象打印名称.

到目前为止这是我的代码:

List<MyClass> list = getList();

if (list != null && list.size() > 0) {
    System.out.println(list.get(0).getName());
} else {
    System.out.println("list is empty");
}
Run Code Online (Sandbox Code Playgroud)

list只包含一个元素时,这将起作用.现在我需要改进它并考虑一个例子,当有多个元素时 - 在这种情况下我需要打印所有名称,逗号分隔.

例如,输出应该是:

当有3个元素时:

name1,name2,name3 
Run Code Online (Sandbox Code Playgroud)

当有一个元素时:

name1
Run Code Online (Sandbox Code Playgroud)

什么时候没有:

list is empty
Run Code Online (Sandbox Code Playgroud)

什么是最有效的实施方式?

Ale*_* C. 5

您可以Collectors.joining结合使用Collectors.collectingAndThen:

import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.joining;

...

String res = 
    list.stream()
        .map(c -> c.name)
        .collect(collectingAndThen(joining(","), s -> s.isEmpty() ? "list is empty" : s));
Run Code Online (Sandbox Code Playgroud)

如果要在列表为空时考虑该选项,则可以执行以下操作:

String res = 
    Optional.ofNullable(list).map(l -> l.stream()...).orElse("list is empty");
Run Code Online (Sandbox Code Playgroud)

但说实话,我会事先使用if语句:

if(list == null || list.isEmpty()) { 
    return "list is empty"; 
} else { 
    return list.stream().map(c -> c.name).collect(joining(","));
}
Run Code Online (Sandbox Code Playgroud)


hol*_*ava 5

您还可以使用内置类StringJoiner来简化代码,如下面的代码:

StringJoiner joiner = new StringJoiner(",");
joiner.setEmptyValue("list is empty");

list.forEach(it -> joiner.add(it.getName()));

System.out.println(joiner);
Run Code Online (Sandbox Code Playgroud)