我现在正在使用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());
}
但是我认为应该有一个更好的解决方案。有什么建议吗?
谢谢!
答案 0 :(得分:5)
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。