我有以下结构:
class MyClass {
String name;
String descr;
public String getName() {
return name;
}
}
现在我有一个这些对象的列表,如果列表包含任何这些元素,我想从上面的对象打印名称。
到目前为止,这是我的代码:
List<MyClass> list = getList();
if (list != null && list.size() > 0) {
System.out.println(list.get(0).getName());
} else {
System.out.println("list is empty");
}
当list
只包含一个元素时,这将有效。现在我需要改进它并考虑一个例子,当有多个元素时 - 在这种情况下我需要打印所有名称,逗号分隔。
例如,输出应为:
当有3个元素时:
name1,name2,name3
当有一个元素时:
name1
当没有时:
list is empty
实施它的最有效方法是什么?
答案 0 :(得分: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));
如果您想在列表为空时考虑该选项,您可以这样做:
String res =
Optional.ofNullable(list).map(l -> l.stream()...).orElse("list is empty");
但说实话,我会事先使用if语句:
if(list == null || list.isEmpty()) {
return "list is empty";
} else {
return list.stream().map(c -> c.name).collect(joining(","));
}
答案 1 :(得分:5)
您还可以使用内置类StringJoiner
来简化代码,如下所示:
StringJoiner joiner = new StringJoiner(",");
joiner.setEmptyValue("list is empty");
list.forEach(it -> joiner.add(it.getName()));
System.out.println(joiner);