Java 布尔值的流映射?

Java stream mapping for a boolean value?

我有以下 DTO:

@Data
public class MenuItemDTO {
    private UUID siteUuid;
    private UUID productUuid;
    private boolean outOfStock;

    public MenuItemDTO(MenuItem menuItem, boolean outOfStock) {
        this.siteUuid = menuItem.getSiteUuid();
        this.productUuid = menuItem.getProductUuid();
        this.outOfStock = outOfStock;
    }
}

我在 MenuItem 实体中没有 outOfStock 字段,如果记录不为空,我想填写 outOfStock 字段(我只是保留缺货产品)。但是我不确定是否有使用流的正确方法:

public List<MenuItemDTO> findAllBySiteBrandUuid(UUID siteUuid) {
    return menuItemRepository.findAllBySiteUuid(siteUuid)
            .stream()
            .map(m -> new MenuItemDTO(m, m.getUuid() != null))
            .collect(Collectors.toList());
}

1. 由于我没有在 MenuItem 实体中保留 outOfStock 字段,我在 MenuItemDTO 中的方法是否正确?

2. 我想知道是否有更优雅的方法通过在 .map(m -> new MenuItemDTO(m, m.getUuid() != null)) 部分正确使用流。

有些重复。您正在将对象和对象的字段传递给构造函数。也许更优雅的方法是通过将逻辑移至构造函数来避免两次传递信息:

public MenuItemDTO(MenuItem menuItem) {
    this.siteUuid = menuItem.getSiteUuid();
    this.productUuid = menuItem.getProductUuid();
    this.outOfStock = menuItem.getUuid() != null;
}

然后流映射缩减为:

public List<MenuItemDTO> findAllBySiteBrandUuid(UUID siteUuid) {
    return menuItemRepository.findAllBySiteUuid(siteUuid)
            .stream()
            .map(MenuItemDTO::new)
            .collect(Collectors.toList());
}

DTO 中的信息是客户需要的任何信息,因此我们无法决定将布尔值放在那里是否正确。我会说,如果那是将在客户端使用的东西,那就太好了。