Java 8 - 从List中过滤空字符串不起作用

sta*_*low 10 java java-8 java-stream

我想从字符串列表中删除一个空字符串.

以下是我尝试使用流API的方法:

list.stream().filter(item-> item.isEmpty()).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

并且列表中仍然存在空字符串.我错过了什么?

JB *_*zet 27

filter() 保留与谓词匹配的元素.Soyou需要反向谓词:

list.stream().filter(item-> !item.isEmpty()).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

这也不会修改原始列表.它将创建原始列表的过滤副本.所以你需要

list = list.stream().filter(item-> !item.isEmpty()).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

如果要修改原始列表,则应使用

list.removeIf(item -> item.isEmpty());
Run Code Online (Sandbox Code Playgroud)

或者干脆

list.removeIf(String::isEmpty);
Run Code Online (Sandbox Code Playgroud)


lcz*_*ski 8

从 java 11 开始有一个新方法 Predicate::not

所以你可以这样写:

list.stream().filter(Predicate.not(String::isEmpty)).collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)


Pet*_*rey 5

我怀疑你没有保留结果。结果返回,原始列表不会改变,因为这是函数式编程风格。

list = list.stream().filter(item-> !item.trim().isEmpty()).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)