Java Stream .map三元运算符

时间:2019-10-05 15:30:53

标签: java java-stream

我有一个TXT.File文件,其中的行代表了一些对象

  

R线(一个)

     

RN线(1 ...很多)

它们与id连接在一起,因此为了读取文件,我做了一个lines().stream

Stream<Boolean> inLines = in.lines()
         //limit lines due to memory footprint
        .limit(10)
         //filter each line by the given id
        .filter(identN -> ident.matches(".*\\t[5]\\t.*"))
        /**
         * should return all lines with id 5
         * if line starts with RN put it in rnArray else in rArray so the objects are connected but i need for validation purposes each line seperate??
         */
        .map(y -> (y.startsWith("RN") ? synonym1.add(y) : substance.add(y)));


System.out.println("syn1 = " + synonym1.toString() + "substance: = " + substance + " InLines"+ inLines);

响应为空:

syn1 = []substance: = [] InLinesjava.util.stream.ReferencePipeline$3@3aa9e816

但是它不起作用。 .map的返回值应该是另一个流,因此如果我将其用于每个逻辑,那么该如何将其合并,因为我还需要r-Line。

2 个答案:

答案 0 :(得分:1)

原因

响应为空,因为在您创建的StreaminLines)上没有没有终端操作。因此,当您在打印到控制台时尝试访问它们时,synonym1substance都保持为空。

备用

您可能正在寻找的是用map替换最后的forEach操作,因为它将持久保存发现的synonym1substance类型的元素似乎是您的主要用例。可以这样做:

.forEach(y -> {
    if (y.startsWith("RN")) {
        synonym1.add(y);
    } else {
        substance.add(y);
    }
});

注意

当前,将Stream<Boolean>收集到Collection并没有多大意义,因为这将包括对.add和{每个已过滤元素的{1}}个集合。

答案 1 :(得分:0)

感谢@Naman,它为我提供了很多帮助,因为我找到了一种允许我也使用三元运算符并通过对

分组将流分成2个单独列表的方法。
 .forEach((x) -> ((x.startsWith("RN"))?synonym:substance).add(x));

所以问题是x运算符不在括号内,我认为是因为  将对象分组或还有其他解释

谢谢