如何检测我在上一次循环中的时间? (拉姆达)

时间:2017-04-27 17:31:03

标签: java lambda

我写了这个:

Arrays
            .stream(docIDs.split(","))
            .parallel()
            .forEachOrdered(i -> {
                        try {
                            System.out.print(
                                    Files.lines(Paths.get(spamDir +"\\cw12-" + i.substring(10,16) + ".txt"))
                                            .filter(j -> j.matches("^(\\d\\d)\\s" + i)) 
                                            .map(line -> line.substring(0, line.indexOf(" "))) 
                                            .findFirst()    
                                            .orElse("-1")
                            );
                        } catch (Exception e1) {
                            System.out.print("-1");
                        }
                    }
            );

如上所示,我正在打印字符串的一部分。

我需要在每个元素(数字)之间加上','逗号。 { 我会检查我是否在最后一个元素中,我会用','逗号说。这就是为什么我需要知道我是否在最后一个元素。 }

我想了很多,但我找不到解决方法。我怎么能这样做?

1 个答案:

答案 0 :(得分:3)

一些事情:

  • parallelforEachOrdered基本上相互抵消。
  • parallel无论如何都不是一个好主意。
  • 您无法检测到您是否在最后一个元素中。
  • 无论如何,这是一个更好的解决方案。

    System.out.println(
        Arrays.stream(docIDs.split(","))
        .parallel() // included because OP included it
        .map(i -> {
            // this is how you should use Files.lines anyway
            try (Stream<String> lines = Files.lines(Paths.get(spamDir +"\\cw12-" + i.substring(10,16) + ".txt"))) {
               return lines
                           .filter(j -> j.matches("^(\\d\\d)\\s" + i)) 
                                        .map(line -> line.substring(0, line.indexOf(" "))) 
                           .findFirst()    
                           .orElse("-1");
            } catch (IOException e1) {
                return "-1";
            }
        })
        .collect(Collectors.joining(",")));
    

...原始问题答案的核心是使用Collectors.joining,而不是首先尝试执行顺序循环。