Java从findFirst()返回Optional <String>

ras*_*vap 3 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();
    }
Run Code Online (Sandbox Code Playgroud)

有什么复杂的方法可以实现这一目标吗?

我做了下一个:

@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());
    }
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

dav*_*xxx 5

用途Optional.map()

 return template.findByN1QLProjection(queryWithParameter, Room.class)
                .stream()
                .findFirst()
                .map(Room::getId)
Run Code Online (Sandbox Code Playgroud)

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