我有一个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。
答案 0 :(得分:1)
响应为空,因为在您创建的Stream
(inLines
)上没有没有终端操作。因此,当您在打印到控制台时尝试访问它们时,synonym1
和substance
都保持为空。
您可能正在寻找的是用map
替换最后的forEach
操作,因为它将持久保存发现的synonym1
和substance
类型的元素似乎是您的主要用例。可以这样做:
.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运算符不在括号内,我认为是因为 将对象分组或还有其他解释
谢谢