Lambda过滤器未按预期工作

时间:2017-09-21 17:59:41

标签: java lambda java-8 java-stream

我在我的代码中使用了这个lambda表达式:

File slika = new File(tempPath + File.separator + imena.stream().filter(x -> !x.trim().equals("null")).findFirst().get());

它应该从发布到我的servlet的文件中获取一个名称,该名称不等于null。我检查了ArrayList<String> imena的内容,发现它包含以下内容(以逗号分隔):null,null,null,Photo0098.jpg。最后一个是我发布到服务器的那个,以及应该被过滤器拾取的那个,而是我得到一个空指针异常。这段相同的代码可以在另一个处理文件上传的servlet上运行。有人可以告诉我为什么我的代码在这里工作不正常,即使它在其他地方工作的条件相同吗?

3 个答案:

答案 0 :(得分:6)

看起来列表中的值是实际null,而不是内容为"null"的字符串。使用方法引用Objects.nonNull是一种过滤它们的优雅方法:

File slika = 
new File(tempPath + 
         File.separator + 
         imena.stream().filter(Objects::nonNull).findFirst().get());
         // Here --------------^

答案 1 :(得分:2)

那是因为您的元素x为空。当您尝试修剪string NullPointerException时,File slika = new File(tempPath + File.separator + imena.stream().filter(x -> x != null).findFirst().get());

试试这个

{{1}}

答案 2 :(得分:1)

修剪现有的String永远不会返回null,因为它包含要修剪的任何内容,否则它将首先抛出NullPointerException。直接过滤null值。

imena.stream().filter(x -> x != null).findFirst().get();