Java Stream.map三元运算符
我有一个TXT.文件,其中的行表示一些对象 R线(一条) RN线(1…多个) 它们通过id连接,因此为了读取文件,我制作了一个Java Stream.map三元运算符,java,java-stream,Java,Java Stream,我有一个TXT.文件,其中的行表示一些对象 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(ide
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);
但它不起作用。.map的返回应该是另一个流,因此,如果我对每个流都使用该逻辑,那么如何合并该逻辑呢?因为我还需要r行,所以它不起作用。原因
响应为空,因为您创建的流(内联线
)上没有调用终端操作。因此,synonym1
和substance
在打印到控制台时,当您尝试访问它们时,它们都保持为空
候补
您可能只是想用一个forEach
来替换最后的map
操作,因为它将同时保留找到的synonym1
和substance
类型的元素,这些元素似乎是您的主要用例。这可以通过以下方式实现:
.forEach(y -> {
if (y.startsWith("RN")) {
synonym1.add(y);
} else {
substance.add(y);
}
});
注
目前,将流
收集到集合
中没有多大意义,因为这将包括的结果。为每个过滤元素在同义词1
和物质
集合上添加
操作。谢谢@Naman,这对我有很大帮助,因为我找到了一种方法,允许我也使用三元运算符,并通过分组将流拆分为两个单独的列表
.forEach((x) -> ((x.startsWith("RN"))?synonym:substance).add(x));
所以问题是x运算符不在括号内,我想是因为
分组对象或是否有其他解释
谢谢好的,谢谢你所说的终端操作是什么意思?三元也不能使用吗?为什么?@MicroLova要了解终端操作的含义,请参阅。应使用三元运算,但只有在未来的运算中需要它们的返回值时才使用。根据我的理解,三元运算是返回值,if/else只是一个不返回任何值的块。谢谢,非常有用。注意:你的意思是如果我使用collect()-方法,那么它将包括同义词1和substance.adds到收集器。toList collection?@MicroLovaadd
方法有一个Boolean
返回类型,用于成功添加到集合中。我的意思是,如果您收集该列表,则该列表将具有与add
操作相对应的布尔值。
.forEach((x) -> ((x.startsWith("RN"))?synonym:substance).add(x));