如何在Stream Map转换DTO时仅当父评论非空时设置commentId字段?
如何在Spring Boot中仅当Comment的parent属性非空时才给CommentDto的commentId赋值?
问题描述
我在Spring Boot项目中编写了获取指定帖子评论列表的接口,通过Stream的map方法将Comment转换为CommentDto。现在希望仅当Comment的parent属性不为空时,才给CommentDto的commentId字段赋值,但当前的实现存在问题:
@GetMapping("api/posts/{id}/comments") public Result findComment(@PathVariable("id") Long id) { List<Comment> comments = commentRepository.findAllComment(id); System.out.println("parent: " + comments.get(2).getParent().getId()); List<CommentDto> collect = comments.stream() .map(c -> new CommentDto(c)) .collect(Collectors.toList()); System.out.println("1. collect: " + collect); return new Result(collect.size(), collect); } @Data static class CommentDto { private Long id; private Long commentId; private String comment; private String nickname; public CommentDto(Comment com) { id = com.getId(); comment = com.getComment(); if (!com.getParent().equals(null)) { commentId = com.getParent().getId(); } nickname = com.getMember().getNickname(); } }
解决方案
你当前的判断逻辑!com.getParent().equals(null)存在致命的空指针风险:如果com.getParent()本身是null,调用equals()方法会直接抛出NullPointerException。下面是两种正确的实现方式:
方式一:直接非空判断(简单直观)
修改CommentDto的构造函数,先判断parent是否不为null,再赋值:
public CommentDto(Comment com) { id = com.getId(); comment = com.getComment(); // 正确的非空判断:先检查对象是否存在,再调用方法 if (com.getParent() != null) { commentId = com.getParent().getId(); } nickname = com.getMember().getNickname(); }
方式二:使用Optional处理(Java 8+优雅写法)
利用Optional来优雅处理可能为空的对象,同时避免空指针:
public CommentDto(Comment com) { id = com.getId(); comment = com.getComment(); // Optional.ofNullable 包裹可能为空的parent,map提取id后赋值 Optional.ofNullable(com.getParent()) .map(Comment::getId) .ifPresent(id -> this.commentId = id); nickname = com.getMember().getNickname(); }
额外提醒
如果com.getMember()也有可能为null,这里同样会触发空指针异常,你可以用同样的方式处理,比如:
// 处理member可能为空的情况,为空时设置默认昵称 nickname = Optional.ofNullable(com.getMember()) .map(Member::getNickname) .orElse("匿名用户");
内容的提问来源于stack exchange,提问作者zhao
相关产品推荐
相关产品推荐

