java—如果流为空,如何创建不同的列表

krugob8w  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(362)

如果流是空的,有没有好的方法来创建一个不同的列表?
这里如果 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();
    }
}
pdsfdshx

pdsfdshx1#

如果您坚持将其保留在流管道中,您可以:

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 ). 喜欢哪一种主要是口味的问题。

axzmvihb

axzmvihb2#

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

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

后者显然更具可读性,因此大脑在试图弄清发生了什么时所做的工作更少
后者还避免了创建一个可选示例,从而提高了效率

相关问题