从 Optional 返回集合

Returning set from Optional

所以我想 return 从数据库中的实体设置。所以我有 crudRepository,首先我 return 可选的 Knight 从 repo 通过 id 查找,然后我想从 Optionlal

得到他的一组任务
public Set<Quest> getAllUserStories(Long id)
    {
        Optional<Knight> knight = knightRepository.findById(id);
       Set<Quest>set = knight.stream().map(k->k.getQuests()).collect(Collectors.toSet());


        return listToReturn;
    }

它几乎可以工作,但它是一套,我不知道如何在不固定的情况下夹住东西? 另一个问题是如果那组任务是空的,会在 null 上收集工作吗?

        public Set<Quest> getAllUserStories(Long id){
            //Assuming Knight is a List or Set
            Optional<Knight> knightOptional = knightRepository.findById(id);
            //check here if value is present in the optional or not
            Knight knight = knightOptional.isPresent() ? knightOptional.get() : null;
            if(knight != null){
                return knight.stream().map(k->k.getQuests()).collect(Collectors.toSet());
            }
            return new HashSet<Quest>();
        }

你的陈述“但它的集合”表明方法 getQuests() returns 已经是 Set<Quest>

要用 Stream 展平嵌套结构,您需要使用 flatMap:

public Set<Quest> getAllUserStories(Long id) {
    Optional<Knight> knight = knightRepository.findById(id);
    Set<Quest> set = knight.stream()
        .flatMap(k -> k.getQuests().stream())
        .collect(Collectors.toSet());
    return set;
}

但是因为最多有一个Knight,因此这里最多有一个Set<Quest>,所以根本不需要走Stream路线。你可以简单地使用

public Set<Quest> getAllUserStories(Long id) {
    Optional<Knight> knight = knightRepository.findById(id);
    Set<Quest> set = knight.map(Knight::getQuests).orElse(Set.of());
    return set;
}

遵循任意属性的一般模式,换句话说,这个 属性 具有 Set 类型这一事实并不重要。您所需要的只是空可选的合适默认值。这里,Set.of() 提供了一个不可变的空集。它类似于 Collections.emptySet(),除了它有更严格的 null 处理,即甚至拒绝像 contains(null).

这样的查询尝试

如果您怀疑这样严格的 null 处理可能存在代码问题,您可以改用 Collections.emptySet()