java stream filter 为空
时间: 2025-02-25 08:42:52 浏览: 95
### Java Stream 过滤空值的方法
当使用 Java Stream 处理集合时,遇到可能为空的元素是一个常见的情况。为了有效处理这些情况并确保程序健壮性,可以采用多种方法来过滤掉空值。
#### 使用 `filter` 和 `Objects.nonNull`
一种简单而直观的方式是在流管道中加入 `filter` 操作,并利用 `Objects.nonNull()` 来排除任何 null 值:
```java
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
public class NullFilterExample {
public static void main(String[] args) {
List<String> listWithNulls = Arrays.asList("one", null, "two", "", "three");
List<String> nonNullList = listWithNulls.stream()
.filter(Objects::nonNull)
.collect(Collectors.toList());
System.out.println(nonNullList);
}
}
```
这段代码展示了如何创建一个新的列表 `nonNullList`,其中不包含原始列表中存在的任何 null 元素[^1]。
#### 结合 Optional 类型进行更复杂的逻辑判断
对于那些不仅可能是 null 而且还可能是其他形式的有效状态(比如空字符串),则可以通过引入 `Optional` 对象来进行更加细致化的控制:
```java
import java.util.Optional;
import java.util.stream.Stream;
// ...
Stream<Optional<String>> optionalStream = Stream.of(
Optional.ofNullable(null),
Optional.of("valid"),
Optional.empty(),
Optional.of("")
);
List<String> validStringsOnly = optionalStream
.flatMap(opt -> opt.map(Stream::of).orElseGet(Stream::empty))
.filter(s -> !s.isEmpty())
.collect(Collectors.toList());
System.out.println(validStringsOnly);
```
这里先将潜在含有 null 的对象封装成 `Optional` 实例组成的流,再通过 `flatMap` 将其展开为实际存在的非空串构成的新流,最后应用额外条件进一步筛除不必要的项[^2].
#### 利用自定义谓词函数增强灵活性
除了上述基本手段外,还可以编写特定业务需求下的定制化 predicate 函数作为参数传递给 `filter` 方法,从而实现更为复杂的数据清洗过程。例如,在某些应用场景下,除了要移除 null 或者空白字符之外,还需要满足更多约束条件才能保留下来某个条目。
```java
private static boolean isValidEntry(Object obj) {
return Objects.nonNull(obj) && !(obj instanceof String && ((String)obj).trim().isEmpty());
}
// Usage example within a stream pipeline:
listOfItems.stream().filter(MainClass::isValidEntry).toList();
```
这种方法允许开发者根据具体项目的要求灵活调整验证规则,而不必局限于预设的功能集内[^3].
阅读全文
相关推荐


















