代码之家  ›  专栏  ›  技术社区  ›  VextoR

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

  •  4
  • VextoR  · 技术社区  · 6 年前

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

    这里如果 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();
        }
    }
    
    2 回复  |  直到 6 年前
        1
  •  7
  •   Ousmane D.    6 年前

    如果希望将其作为单个管道,则可以执行以下操作:

    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)));
    

    但是,我不建议简单地继续使用这种方法,因为它不是可选的预期目的。

    相反,你最好是:

    List<String> result;
    if(special.isEmpty())
       result = Collections.singletonList(myString);
    else
       result = special.stream().map(s -> createNewVal(s)).collect(Collectors.toList());
    
    • 后者显然更易于阅读,因此导致 想弄清楚发生了什么事。;)
    • 后者还避免创建可选实例,从而提高效率
        2
  •  4
  •   Naman    6 年前

    如果您坚持将其保留在流管道中,则可以执行以下操作:

    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 )更喜欢哪一种在很大程度上取决于口味。