从 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()
。
所以我想 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()
。