java .stream().filter
时间: 2024-08-23 16:00:46 浏览: 84
`java.stream().filter()` 是 Java Stream API 中的一个操作,用于过滤集合中的元素。它返回一个新的 Stream 对象,这个新的 Stream 只包含通过给定条件判断后的元素。这个操作类似于列表遍历并根据某个函数的结果保留或丢弃元素。
例如,如果你有一个整数列表 `List<Integer> numbers`,你可以这样做:
```java
List<Integer> filteredNumbers = numbers.stream()
.filter(number -> number % 2 == 0) // 过滤出偶数
.collect(Collectors.toList()); // 将结果收集到新的列表中
```
在这个例子中,`filter()` 方法接受一个谓词(predicate,即一个返回 boolean 值的函数),如果元素满足该谓词,则会被保留在新 Stream 中。`collect()` 方法则是将过滤后的 Stream 转换回列表形式。
相关问题
Exception in thread "main" java.lang.NullPointerException: element cannot be mapped to a null key at java.util.Objects.requireNonNull(Objects.java:228) at java.util.stream.Collectors.lambda$groupingBy$45(Collectors.java:907) at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) at com.cd.test.Test1.exportNodeToExcel(Test1.java:71) at com.cd.test.Test1.main(Test1.java:49)
这个错误提示表明代码中出现了空指针异常,即对一个空对象进行了操作。具体而言,是在使用 `Collectors.groupingBy()` 方法时,传入了一个 null 的键值,导致出现了空指针异常。
在 Java 中,`Collectors.groupingBy()` 方法可以用来按照某个属性对集合进行分组,返回一个 `Map` 对象,其中键是属性值,值是对应的元素列表。如果集合中有元素的属性值为 null,则会抛出空指针异常。
要解决这个问题,需要在使用 `Collectors.groupingBy()` 方法之前,确保集合中的元素属性值不为 null。可以使用 `Objects.requireNonNull()` 方法对属性值进行校验,如果为 null 则抛出异常。例如:
```
Map<String, List<Node>> groupByProperty = nodeList.stream()
.filter(node -> Objects.requireNonNull(node.getProperty()) != null)
.collect(Collectors.groupingBy(Node::getProperty));
```
在这个例子中,使用 `Objects.requireNonNull()` 方法对 `node.getProperty()` 进行校验,确保其不为 null。如果为 null,则会抛出 `NullPointerException` 异常。这样可以避免出现空指针异常。
java.util.stream.Stream 类
java.util.stream.Stream 类是 Java 8 中引入的一个新的 API,用于处理集合和数组的数据。Stream 类提供了一种类似于 SQL 的声明式语法,可以对数据进行过滤、映射、排序、聚合等一系列操作,从而实现快速、简洁、灵活的数据处理。
Stream 类的特点包括:
- 声明式:Stream 类提供了一种类 SQL 的声明式语法,可以让开发者轻松地表达出数据处理的逻辑。
- 并发执行:Stream 类内部使用了多线程技术,可以并发地处理数据,提升了数据处理的效率。
- 惰性求值:Stream 类的操作是惰性求值的,即只有在需要结果时才会进行计算,可以避免不必要的计算。
Stream 类的常用操作包括:
- filter:过滤数据。
- map:对数据进行映射。
- flatMap:对数据进行扁平化处理。
- sorted:对数据进行排序。
- distinct:去重。
- limit:限制数据集的大小。
- skip:跳过前几个元素。
- forEach:遍历数据集并执行某些操作。
- collect:将数据集转换为集合或数组。
- reduce:进行聚合操作。
Stream 类的使用需要注意以下几点:
- Stream 类的操作是惰性求值的,必须通过终止操作才能得到结果。
- Stream 类的数据只能被消费一次,一旦进行了终止操作,该 Stream 对象就不能再使用。
- Stream 类的操作是无状态的,不能改变原数据集,而是返回一个新的 Stream 对象。
阅读全文