如何在最小场景中调用 Optional 上的方法
How to invoke a method on Optional in minimal scenario
我有 Json 看起来像这样:
{
"workshop_name" : "ABC"
"user_name" : "DEF"
}
在我的应用程序中 workshop_name
不是强制性的,因此它可以以最小版本出现:
{
"user_name" : "DEF"
}
现在我正在考虑使用 Java8 Optional 从 JSON 得到 workshop_name
。我正在使用 org.json 库和 JSONObject
。我可以像这样轻松地检查可选的:
public static EnrichContext createEnricher(JSONObject json) {
EnrichContext enrichContext = new EnrichContext();
enrichContext.setWorkshopName(Optional.ofNullable(json.getString("workshop_name")).orElse("DEFAULT"));
enrichContext.setUserName(json.getString("user_name"));
}
我被迫切换到 GSON,它看起来有点不同。
json.get("workshop_name").getAsString();
这意味着我在 JsonObject(来自 GSON)上调用 get
后中间有一个新对象。
我尝试使用嵌套可选检查,但它看起来太复杂了。
我想出来的是:
enrichContext.setWorkshopName((Optional.ofNullable(json.get("workshop_name")).orElse(new JsonPrimitive("DEFAULT"))).getAsString());
我不喜欢在每次阅读时都创建新的 JsonPrimitive
的想法。有没有更好的方法来解决这个问题?
您可以使用 Optional<String>
而不是 Optional<JsonPrimitive>
String workshopName = Optional.ofNullable(json.get("workshop_name"))
.map(JsonElement::getAsString)
.orElse("DEFAULT");
我有 Json 看起来像这样:
{
"workshop_name" : "ABC"
"user_name" : "DEF"
}
在我的应用程序中 workshop_name
不是强制性的,因此它可以以最小版本出现:
{
"user_name" : "DEF"
}
现在我正在考虑使用 Java8 Optional 从 JSON 得到 workshop_name
。我正在使用 org.json 库和 JSONObject
。我可以像这样轻松地检查可选的:
public static EnrichContext createEnricher(JSONObject json) {
EnrichContext enrichContext = new EnrichContext();
enrichContext.setWorkshopName(Optional.ofNullable(json.getString("workshop_name")).orElse("DEFAULT"));
enrichContext.setUserName(json.getString("user_name"));
}
我被迫切换到 GSON,它看起来有点不同。
json.get("workshop_name").getAsString();
这意味着我在 JsonObject(来自 GSON)上调用 get
后中间有一个新对象。
我尝试使用嵌套可选检查,但它看起来太复杂了。
我想出来的是:
enrichContext.setWorkshopName((Optional.ofNullable(json.get("workshop_name")).orElse(new JsonPrimitive("DEFAULT"))).getAsString());
我不喜欢在每次阅读时都创建新的 JsonPrimitive
的想法。有没有更好的方法来解决这个问题?
您可以使用 Optional<String>
而不是 Optional<JsonPrimitive>
String workshopName = Optional.ofNullable(json.get("workshop_name"))
.map(JsonElement::getAsString)
.orElse("DEFAULT");