在stream和noneMatch上遇到一些麻烦

时间:2017-01-22 04:37:37

标签: java java-8 java-stream

我现在已经很长一段时间一直在撞墙,我真的很感激一些帮助。
我有2个流,我想要的是从一个流中排除元素,如果它们在另一个流中 我正在尝试编写一个程序来查找所有音频文件,然后将它们写入文件。你给它一个文件夹来检查,它找到该文件夹​​中的所有音频文件,并将它们全部写入文件。那部分效果很好。如果你再次给它相同的文件夹,问题就会发挥作用,我希望能够排除已经存在的音频文件。以下是有问题的代码:

Stream<Path> s = Files.walk(folder.toPath()).filter(p -> isAudio(p));

然后是isAudio(Path p)方法:

try
{
    if (Files.probeContentType(p).startsWith("audio"))
    {
        if (PS != null)
        {
            System.out.println("boo");
            System.out.println(PS.noneMatch(t -> t.equals(p.toString())));
            System.out.println("boo2");
        }
        return true;
    }
}
catch (Exception e) {System.err.println(e); }
return false;

PS是我的第二个流,它从文件读入。我测试了它,它是正确的。我的问题是不打印noneMatch的结果,并且永远不会显示“boo2”。它每次都被跳过。它跳到“返回假”;每一次,我完全迷失了答案。拜托,我能得到的任何帮助都将不胜感激!!

2 个答案:

答案 0 :(得分:0)

不确定您的系统是如何配置的,但是您的stderr输出可能无法查看。你能尝试用以下内容替换你的catch子句吗?

catch (Exception e) {
   System.out.println("Exception encountered: " + e);
   System.err.println(e); 
 }

然后尝试重新运行您的代码,也许您将能够看到&#34;遇到异常&#34;消息,以及被抛出的例外情况。

答案 1 :(得分:0)

也许您应该尝试将调用分成两部分:

  1. 过滤名称中包含audio的文件
  2. 通过key(姓名)
  3. 区分它们

    像这样(伪代码):

    yourFiles.filter(t -> "*audio*".matches(t)).filter(distinctByKey( e -> e.getAbsolutePath())

    Here I found the answer to problem 2 (stackoverflow link)。有distinctByKey方法的代码。