将默认项添加到流集合

gri*_*rdo 7 java java-8

我正在流上执行一些操作并返回一个数组列表.这工作没有问题,但我需要做最后一步,如果数组列表为空,添加一个元素(与options/nulls无关只是要求的一部分)我的方式有点笨重,我想知道它是否可以而是在流操作中完成?

public ArrayList<String> getArrayList () {

        ArrayList<String> aL =  setOfStrings.stream()
            .filter(remove some)
            .filter(remove some more)
            .map(i -> createStringAbout(i))
            .collect(Collectors.toCollection(ArrayList::new));

        if (aL.size() < 1) {
            aL.add("No items passed the test");
        }

        return aL;
    }
Run Code Online (Sandbox Code Playgroud)

所以我真的想做

return set.stream()...
Run Code Online (Sandbox Code Playgroud)

这可能吗 ?

pvp*_*ran 6

使用 collectingAndThen

.collect(Collectors.collectingAndThen(ArrayList::new, rs -> {
                    if(rs.size() < 1 ) {
                        rs.add("something");
                    }
                   return rs;
                })
Run Code Online (Sandbox Code Playgroud)

  • [`Collectors.toList()`](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#toList--):"*没有任何保证返回的类型,**可变性**,可序列化或线程安全性*"; 这意味着你不能假设你可以"添加"另一个元素.除此之外,`rs.size()<1`可以简化为`rs.isEmpty()`... (6认同)
  • @gringogordo在`if`块之后缺少`return rs`.此外,Holger是对的:你需要做`Collectors.toCollection(ArrayList :: new)`而不是`Collectors.toList()` (2认同)