繁体   English   中英

如何模仿列表 <Optional<T> &gt;喜欢Spring Data Repo中的行为?

[英]How to mimic List<Optional<T>> like behaviour in Spring Data Repo?

我正在尝试使用list of Id's query数据库,如果它们不存在,请用它们做一些事情。

我的计划是做类似的事情

List<Optional<MyObject>> fingById(Set<String> myIds);

我明白这不会开箱即用,因为我认为即使所有的id都存在也无法保证我们会被订购,所以如果它们中的一些存在,我会得到一些随机的null选项,我不会能够返回它的Id。

基本上我最终需要做的是检索这些对象,更新一个字段或使用默认值创建它们(如果不存在)。

这是批量执行此操作的最佳方式?

谢谢 :)

您可以按照其ID将结果映射到Map<String, Optional<MyObject>> ,然后使用Optional.empty()填充空白。

List<MyObject> findByIdIn(Set<String> ids);

default Map<String, Optional<MyObject>> mapByIdIn(Set<String> ids) {
    Map<String, Optional<MyObject>> found = findByIdIn(ids)
            .stream()
            .collect(Collectors.toMap(MyObject::getId, Optional::of));
    ids.stream()
       .filter(id -> !found.containsKey(id))
       .forEach(id -> found.put(id, Optional.empty()));
    return found;
}

我不认为使用List of Optional值是个好主意。 相反,我建议只使用存储库的默认方法并查询所有现有实体。

List<MyObject> findAll();

之后,您可以遍历所有对象并检查缺少的ID。 为了提高性能,我建议使用Map

var objectMap = repository.findAll().stream()
    .collect(Collectors.toMap(MyObject::getId, Function::Identity);

然后,您只需检查地图中是否包含任何ID:

myIds.stream().filter(objectMap::contains)
    .forEach({
        // do some stuff, present id
    });

myIds.stream().filter((id) -> !myMap.contains(id))
    .forEach({
        // do some stuff, not present id
    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM