【问题标题】:Java Stream .map ternary operatorJava Stream .map 三元运算符
【发布时间】:2019-10-06 04:03:53
【问题描述】:

我有一个 TXT.File,其中的线条代表一些对象

R-Line(一)

RN-Line (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。

【问题讨论】:

    标签: java java-stream


    【解决方案1】:

    原因

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

    备用

    您可能正在寻找的是用forEach 替换最终的map 操作,因为它会同时保留synonym1substance 类型的元素,这似乎是您的主要用例。这可以这样做:

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

    注意

    目前,将Stream&lt;Boolean&gt; 收集到Collection 中没有多大意义,因为这将包括对每个过滤元素的synonym1substance 集合进行.add 操作的结果。

    【讨论】:

    • 好的,谢谢你所说的终端操作,也不能使用三元?为什么?
    • @MicroLova 要了解终端操作的含义,请参阅documentation here。并且应该使用三元运算,但前提是在将来的运算中需要它们的返回值。
    • 好吧,据我了解,三元是返回值,而 if/else 只是一个不返回任何内容的块。谢谢,很有帮助
    • 附注:你的意思是如果我会使用 collect() 方法,那么这将包括 synonym1 和 material.adds 到 Collectors.toList 集合?
    • @MicroLova add 方法有一个 Boolean 返回类型,用于成功添加到集合中。我的意思是,如果您收集该列表,那么该列表将具有与 add 操作相对应的布尔值。
    【解决方案2】:

    感谢@Naman,它帮助了我很多,因为我找到了一种方法,让我也可以使用三元运算符并通过分组将流分成 2 个单独的列表

     .forEach((x) -> ((x.startsWith("RN"))?synonym:substance).add(x));
    

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

    谢谢

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 2014-02-08
      • 2011-03-12
      • 2019-07-19
      • 2014-04-04
      • 1970-01-01
      • 2014-09-25
      • 2014-09-29
      相关资源
      最近更新 更多