【问题标题】:How to create a different List if Stream is empty如果 Stream 为空,如何创建不同的列表
【发布时间】:2018-12-06 15:39:09
【问题描述】:

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

如果special 为空,我想用另一个值创建一个新的List。 但是如果special 不为空,我想基于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();
    }
}

【问题讨论】:

  • 我认为没有比您已经在做的更好的方法了。

标签: java collections java-8 java-stream


【解决方案1】:

如果您想将其作为单个管道,那么您可以这样做:

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 实例,从而提高效率

【讨论】:

    【解决方案2】:

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

    List<String> newVals = special.stream()
            .map(s -> createNewVal(s))
            .collect(Collectors.collectingAndThen(Collectors.toList(),
                    l -> l.isEmpty() ? Collections.singletonList(myString) : l));
    

    我更喜欢你自己的代码。

    顺便说一句,您可以使用.map(X::createNewVal) 代替.map(s -&gt; createNewVal(s))(因为您的课程称为X)。喜欢哪一种很大程度上取决于口味。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      • 2022-01-26
      • 1970-01-01
      • 2017-10-08
      相关资源
      最近更新 更多