java - 如果 Stream 为空,如何创建不同的列表

标签 java collections java-8 java-stream

如果流为空,是否有创建不同列表的好方法?

这里,如果 special 为空,我想用另一个值创建一个新的 List。 但是如果 special 不为空,我想创建基于 specialList。 我不知道是否有将这些与流结合起来的好方法

这是一个不太好的解决方案

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/

相关文章:

java - 为什么 Java 在构造函数重载的情况下无法识别我的 ArrayList

java - 当 HashMap 或 HashSet 达到最大容量时会发生什么?

java - 从 Swing 应用程序中的 JFXPanel 创建模态舞台

java - Play Framework : parse "CompletionStage" (Java8) response

Java-8 流 : Convert Map<String, List<List<DataType>>> 到 Map<String, List<DataType>>

java - 如何在嵌套类中恢复对 this$0 的引用?

java - Android 基础数学不及格

java - Java和TCL之间的套接字编程

java - 在 Mysql 中分发 Java 应用程序

java - 需要java中HashTable的内部实现