如果Stream为空,如何创建不同的List

Vex*_*toR 4 java collections java-8 java-stream

如果流为空,有没有一种很好的方法来创建不同的List?

如果special为空,我想创建一个List带有另一个值的new .但如果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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Ous*_* D. 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)));
Run Code Online (Sandbox Code Playgroud)

但是,我不建议继续使用这种方法,因为它不是Optional的预期目的.

相反,你会更好:

List<String> result;
if(special.isEmpty())
   result = Collections.singletonList(myString);
else
   result = special.stream().map(s -> createNewVal(s)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
  • 后者肯定更具可读性,因此在试图找出正在发生的事情时导致大脑工作量减少.;)
  • 后者还避免创建可选实例,从而提高效率