【问题标题】:Java Return an Optional<String> from findFirst()Java 从 findFirst() 返回一个 Optional<String>
【发布时间】:2020-01-14 15:10:08
【问题描述】:

我现在正在使用 Optional,我必须从 findFirst() 方法返回一个字符串。我知道 findFirst 返回一个 Optional 但我想在方法签名中返回一个 Optional&lt;String&gt;

@Override
    public Optional<String> findBetweenMinAgeAndMaxAge(int kidAge, String id) {
        String query = buildFindRoomByKidAge();
        JsonObject params = JsonObject.create()
                .put(JAVA_TYPE_PARAM, ShipRoom.class.getName())
                .put(ID_PARAM, id)
                .put(KID_AGE_PARAM, kidAge);

        N1qlQuery queryWithParameter = N1qlQuery.parameterized(query, params);

        return template.findByN1QLProjection(queryWithParameter, Room.class)
                .stream()
                .findFirst();
    }

有没有什么复杂的方法可以做到这一点?

我做了下一个:

@Override
    public Optional<String> findBetweenMinAgeAndMaxAge(int kidAge, String id) {
        String query = buildFindRoomByKidAge();
        JsonObject params = JsonObject.create()
                .put(JAVA_TYPE_PARAM, ShipRoom.class.getName())
                .put(ID_PARAM, id)
                .put(KID_AGE_PARAM, kidAge);

        N1qlQuery queryWithParameter = N1qlQuery.parameterized(query, params);

        return Optional.ofNullable(template.findByN1QLProjection(queryWithParameter, Room.class)
                .stream()
                .findFirst().get().getId());
    }

但我认为应该有更好的解决方案。有什么建议吗?

谢谢!

【问题讨论】:

    标签: java return optional


    【解决方案1】:

    使用Optional.map()

     return template.findByN1QLProjection(queryWithParameter, Room.class)
                    .stream()
                    .findFirst()
                    .map(Room::getId)
    

    map() 接受一个函数,如果可选值中存在值,则返回结果。

    【讨论】:

      【解决方案2】:

      由于您已经有一个Optional&lt;Room&gt;,因此您可以进一步使用Optional#map 作为映射:

      return template.findByN1QLProjection(queryWithParameter, Room.class)
                  .stream()
                  .findFirst()
                  .map(room -> room.getId());
      

      请注意,根据您的第二次修订,map 会自行处理 idnull 并为此类值返回 Optional.empty。来自 javadoc:

      如果映射函数返回空结果,则此方法返回 一个空的可选。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-20
        • 1970-01-01
        • 1970-01-01
        • 2021-10-09
        相关资源
        最近更新 更多