如何过滤和记录Java8流中的空对象

bkkx9g8r  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(401)

我正试着围绕java8流来思考,想知道是否有人能帮我解决这个问题。
在古 java ,

List<Obj> newObjs = ArrayList<Obj>();
for (Obj obj : objects){
  if(obj == null){
     logger.error("null object");
  }
  else{
    newObjs.add(...)
  }
}

基本上,我想过滤空对象并记录它。在Java8中,有什么好方法可以做到这一点?

lx0bsm1f

lx0bsm1f1#

你可以用 peek 在里面放一个if语句:

List<Obj> newObjs = objects.stream().peek(x -> {
    if (x == null) logger.error("null object");
}).filter(Objects::nonNull).collect(Collectors.toList());

但是这种类型会失去流的简洁性,所以我个人还是会使用一个普通的for循环来实现一些简单的事情,比如“过滤空值并收集到一个列表”。
请记住,流不会取代for循环。不要仅仅因为流是新的和闪亮的就使用它。

vcudknz3

vcudknz32#

我建议把这种逻辑换成不同的方法

public boolean filter(Object obj) {

  if(obj == null){
      logger.error("null object");
      return false;
    }
  return true;
}

然后把名单流出来

objects.stream().filter(this::filter).collect(Collectors.toList());

相关问题