stream流过滤为空的数据
时间: 2025-04-18 11:40:36 浏览: 22
### Java Stream API 过滤空值的数据处理
当使用Java的Stream API处理集合中的数据时,确保能够有效过滤掉可能存在的`null`值至关重要。这不仅提高了代码的安全性和可靠性,还使得后续的操作更加稳定。
对于包含潜在`null`值的列表,可以采用如下方法来安全地移除所有的`null`项:
```java
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
public class NullFilterExample {
public static void main(String[] args) {
List<String> listWithNulls = Arrays.asList("apple", null, "banana", "", "cherry");
// 使用 filter 方法排除 null 值并打印结果
List<String> filteredList = listWithNulls.stream()
.filter(item -> item != null && !item.isEmpty())
.collect(Collectors.toList());
System.out.println(filteredList);
}
}
```
上述代码片段展示了如何通过`.filter()`操作符配合条件表达式去除任何为空(`null`)或是空白字符串("")的情况[^2]。
另外一种更为优雅的方式是借助于`Optional`类来进行更复杂的逻辑判断或默认值替换:
```java
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
public class OptionalUsageExample {
public static void main(String[] args) {
List<Optional<String>> listOfOptionals = Arrays.asList(
Optional.ofNullable(null),
Optional.of("hello"),
Optional.empty(),
Optional.of("")
);
// 将 Optional 容器内的非空元素提取出来形成新的列表
List<String> nonEmptyStrings = listOfOptionals.stream()
.flatMap(opt -> opt.map(Stream::of).orElseGet(Stream::empty))
.filter(str -> !str.trim().isEmpty()) // 移除仅含空白字符的字符串
.collect(Collectors.toList());
System.out.println(nonEmptyStrings);
}
}
```
此段程序说明了怎样利用`Optional`对象内部的方法链调用来简化对不确定性的管理,并且同样实现了忽略所有形式上的“空”输入的目的[^3]。
#### 处理复杂结构中的空值
如果面对的是由多个层次嵌套构成的对象图,则可以通过组合多种流操作完成深层次的清理工作。比如,在一个含有可选字段的实体类组成的集合里寻找特定属性不为`null`的实例。
```java
class Person {
private String name;
// getter and setter omitted for brevity
}
// ...
List<Person> people = ... ; // some initialization code here
people.stream()
.map(Person::getName)
.filter(Objects::nonNull)
.distinct()
.forEach(System.out::println);
```
这段例子中,先映射到感兴趣的部分(即人的名字),再做一轮去重后的输出;期间也完成了对可能出现的`null`姓名的有效规避。
阅读全文
相关推荐


















