You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 19:02:46