我有一个对象列表,上面写着car
。我想使用Java8根据一些参数来过滤这个列表,但是如果参数是null
,它就会抛出NullPointerException
。如何过滤掉null值?
当前代码如下
requiredCars = cars.stream().filter(c -> c.getName().startsWith("M"));
如果getName()
返回null
,则抛出NullPointerException
。
发布于 2016-05-24 05:39:33
在这个特殊的例子中,我认为@Tagir是100%正确的,把它放到一个过滤器中,然后做两个检查。我不会使用Optional.ofNullable
,可选的东西实际上是返回类型,而不是逻辑。但实际上不是这里也不是那里。
我想指出的是,在广泛的情况下,java.util.Objects
有一个很好的方法来解决这个问题,所以您可以这样做:
cars.stream()
.filter(Objects::nonNull)
这将清除您的空对象。对于任何不熟悉的人来说,这是以下内容的速记:
cars.stream()
.filter(car -> Objects.nonNull(car))
要部分回答手头的问题,请返回以"M"
开头的汽车名称列表
cars.stream()
.filter(car -> Objects.nonNull(car))
.map(car -> car.getName())
.filter(carName -> Objects.nonNull(carName))
.filter(carName -> carName.startsWith("M"))
.collect(Collectors.toList());
一旦你习惯了速记的lambdas,你也可以这样做:
cars.stream()
.filter(Objects::nonNull)
.map(Car::getName) // Assume the class name for car is Car
.filter(Objects::nonNull)
.filter(carName -> carName.startsWith("M"))
.collect(Collectors.toList());
不幸的是,一旦你.map(Car::getName)
,你将只返回名单的名字,而不是汽车。所以不那么漂亮,但完全回答了这个问题:
cars.stream()
.filter(car -> Objects.nonNull(car))
.filter(car -> Objects.nonNull(car.getName()))
.filter(car -> car.getName().startsWith("M"))
.collect(Collectors.toList());
发布于 2015-10-01 17:37:49
您只需要过滤具有null
名称的汽车:
requiredCars = cars.stream()
.filter(c -> c.getName() != null)
.filter(c -> c.getName().startsWith("M"));
发布于 2016-08-29 22:36:13
提出的答案很好。我只想提出一个改进方案,以处理使用Optional.ofNullable
、new feature in Java 8
List<String> carsFiltered = Optional.ofNullable(cars)
.orElseGet(Collections::emptyList)
.stream()
.filter(Objects::nonNull)
.collect(Collectors.toList());
因此,完整的答案将是:
List<String> carsFiltered = Optional.ofNullable(cars)
.orElseGet(Collections::emptyList)
.stream()
.filter(Objects::nonNull) //filtering car object that are null
.map(Car::getName) //now it's a stream of Strings
.filter(Objects::nonNull) //filtering null in Strings
.filter(name -> name.startsWith("M"))
.collect(Collectors.toList()); //back to List of Strings
https://stackoverflow.com/questions/32884195
复制相似问题