如果Stream为空,如何创建其他列表

时间:2018-12-06 15:39:10

标签: java collections java-8 java-stream

如果流为空,是否有一种很好的方法来创建其他列表?

如果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();
    }
}

2 个答案:

答案 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());
  • 后者肯定更具可读性,因此会减少 试图找出正在发生的事情的大脑。 ;)
  • 后者还避免创建Optional实例,从而提高效率

答案 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)。首选哪个主要取决于口味。