【问题标题】:Having some real trouble with stream and noneMatch在流和 noneMatch 方面遇到了一些真正的问题
【发布时间】:2017-01-22 04:37:36
【问题描述】:

我已经为此苦苦思索了很长一段时间了,非常感谢一些帮助。
我有 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”永远不会显示。它每次都会被跳过。它跳转到“return false”;每一次,我都完全失去了答案。请,我能得到任何帮助将不胜感激!

【问题讨论】:

  • 这是什么 PS 东西,它在哪里声明?显然,无论 noneMatch 正在做什么,都是您问题的一部分。也许它正在阻止某些东西?也许它以某种奇怪的方式失败了?捕获 Throwable 而不是仅检查异常。如果有什么奇怪的事情发生,你会想知道的。下一步是连接调试器并进入 noneMatch 方法以了解它在做什么。

标签: java java-8 java-stream


【解决方案1】:

不确定您的系统是如何配置的,但您的 stderr 输出可能不可见。您可以尝试将您的 catch 子句替换为以下内容吗?

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

然后尝试重新运行您的代码,也许您将能够看到“遇到异常”消息以及正在引发的异常。

【讨论】:

  • 遇到异常:java.lang.IllegalStateException:流已经被操作或关闭
  • 我该如何解决?
  • 似乎您已经对正在使用的 PS 流执行了终端操作。 “终端操作,如Stream.forEach或IntStream.sum,可能会遍历流产生结果或副作用。终端操作执行后,流管道被视为消耗,不能再使用;如果需要再次遍历同一个数据源,必须返回数据源获取新的流。” - docs.oracle.com/javase/8/docs/api/java/util/stream/…
  • @bobthebob55 问题是您的流“PS”已经关闭,或者它没有更多数据。所以你应该在调用 PS.noneMatch() 之前检查一下
  • 我对 PS 流所做的唯一一件事就是设置它的值。 PS = IO.readFile();这是对 PS 所做的唯一事情。我有一个单独的类,它读取文件并将流分配给 PS。什么关闭了流?
【解决方案2】:

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

  1. 过滤名称中带有audio 的文件
  2. 在那里区分它们key(姓名)

类似这样的东西(伪代码):

yourFiles.filter(t -&gt; "*audio*".matches(t)).filter(distinctByKey( e -&gt; e.getAbsolutePath())

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

【讨论】:

    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2019-10-21
    相关资源
    最近更新 更多