Java从findFirst()返回Optional <String>

时间:2019-09-12 17:27:17

标签: java return optional

我现在正在使用Optional,并且必须从findFirst()方法返回一个String。我知道findFirst返回一个Optional,但是我想返回一个Optional<String>,如方法签名中所示。

@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());
    }

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

谢谢!

2 个答案:

答案 0 :(得分:5)

使用Optional.map()

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

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

答案 1 :(得分:3)

由于您已经拥有一个Optional<Room>,因此可以使用Optional#map对其进行进一步映射,如下所示:

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

请注意,根据您的第二次修订,map会照顾id本身就是null,并为这些值返回Optional.empty。来自javadoc:

  

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