如果流为空,是否有创建不同列表的好方法?
这里,如果 special
为空,我想用另一个值创建一个新的 List
。
但是如果 special
不为空,我想创建基于 special
的 List
。
我不知道是否有将这些与流结合起来的好方法
这是一个不太好的解决方案
class X {
public static void main(String[] args) {
String myString = "test";
List<String> special = getSpecialVals();
List<String> newVals =
special.isEmpty() ?
Arrays.asList(myString) :
special.stream().map(s ->
createNewVal(s)).collect(Collectors.toList());
}
static public List<String> getSpecialVals() {
// but can return empty list
return Arrays.asList("One", "Two");
}
static public String createNewVal(String origVal) {
return origVal.toUpperCase();
}
}
最佳答案
如果你想把它作为一个单一的管道,那么你可以这样做:
List<String> strings =
Optional.of(special)
.filter(e -> !e.isEmpty())
.map(l -> l.stream().map(s -> createNewVal(s))
.collect(Collectors.toList()))
.orElseGet((() -> Collections.singletonList(myString)));
但是,我不建议继续使用这种方法,因为它不是 Optional 的预期目的。
相反,你会更好:
List<String> result;
if(special.isEmpty())
result = Collections.singletonList(myString);
else
result = special.stream().map(s -> createNewVal(s)).collect(Collectors.toList());
- 后者绝对更具可读性,因此减少了 大脑试图弄清楚发生了什么。 ;)
- 后者还避免创建 Optional 实例,从而提高效率
关于java - 如果 Stream 为空,如何创建不同的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53654825/