如果流为空,是否有一种很好的方法来创建其他列表?
如果special
为空,我想用另一个值创建一个新的List
。
但是,如果special
不为空,我想基于List
创建special
。
我不知道有没有一种很好的方法可以将它们与流结合起来
这不是一个很好的解决方案
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();
}
}
答案 0 :(得分:7)
如果您希望将其作为单个管道,则可以执行以下操作:
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());
答案 1 :(得分:4)
如果您坚持将其保留在流管道中,则可以这样做:
List<String> newVals = special.stream()
.map(s -> createNewVal(s))
.collect(Collectors.collectingAndThen(Collectors.toList(),
l -> l.isEmpty() ? Collections.singletonList(myString) : l));
我更喜欢自己的代码。
顺便说一句,您可以使用.map(s -> createNewVal(s))
代替.map(X::createNewVal)
(因为您的班级叫X
)。首选哪个主要取决于口味。