如果我的代码Map<String, String>肯定会返回,但可能是空的.转换它是否有益处Optional<Map<String, String>>.它会为空但不是空实例添加任何好处吗?
我有一个带有Optional字段的Java类.我使用Jackson 2.8.3(从Spring web 4.3.3调用)将类序列化为JSON.
如果Optional为空,我希望让序列化程序跳过该字段,并序列化包含的字符串(如果存在).我正在寻找两个对象列表的结果示例:
[
{
"id": 1,
"foo": "bar"
},
{
"id": 2,
}
]
Run Code Online (Sandbox Code Playgroud)
对于id为2的对象,foo Optional为空.
相反,我得到的是:
[
{
"id": 1,
"foo": {
"present": true
}
},
{
"id": 2,
"foo": {
"present": false
}
}
]
Run Code Online (Sandbox Code Playgroud)
即使我在类中注释"bar"字段,这也是结果
@JsonInclude(JsonInclude.Include.NON_ABSENT)
public Optional<String> getFoo() { ...
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以使用Jackson注释或自定义序列化器来获得第一个列表的结果?
我试图模拟在另一个模糊的编程范例中使用的一种指针,所以我可以将一些代码移植到Java.另一种语言不是面向对象的,而是 Pascal的松散灵感.
在原始语言中,我们可以编写这样的代码.首先,使用文本.
// Start with text.
Text myVar = "Bonjour"
Pointer myPointer = ->myVar // Referencing a string variable, storing the reference in another variable of type `Pointer`.
Message( myPointer-> ) // Dereferencing the pointer, to retrieve `myVar`, and pass the string to a command `Display` that displays the message on screen in a dialog box.
Run Code Online (Sandbox Code Playgroud)
然后,切换到数字.
// Switch gears, to work with an number.
Integer vResult = ( Random % ( vEnd - vStart + …Run Code Online (Sandbox Code Playgroud) 我不断看到一些用户说不建议使用带有可选的集合/是不好的做法。我找不到太多关于为什么这是不好的做法的信息,所以我在这里。
如果重要的话,在我的特定情况下,我有一个带有 2 个方法的 JpaRepository。一Optional<List> getValues()又一秒List getDefaultValues(),如下所示:
public interface someRepository extends JpaRepository<x, y> {
Optional<List> getValues();
List getDefaultValues();
}
Run Code Online (Sandbox Code Playgroud)
这个想法是这些值可能不存在,所以我想强制方法调用者这样做,.orElse(getDefaultValues())这样就不会返回空列表。我还认为这比仅仅做这样的事情更整洁:
List list = getValues();
if (list.isEmpty()) {
list = getDefaultValues();
}
Run Code Online (Sandbox Code Playgroud)
如有任何反馈,我们将不胜感激。
编辑:我意识到我的例子并不是最适合这个问题,正如下面的答案所指出的。但是,我仍然想了解为什么Optional<List>有些人认为这是不好的做法。
这个问题并没有真正回答我的问题。
我正在探索在重构我正在研究的代码库的一部分时消除null的可能性.我们已升级到java 8,因此我们Optional<T>随意使用.为了有效地做到这一点,我们需要确保不将null传递给我们的任何方法(这是在我们包装任何潜在的空值之后Optional,从外部服务/库进入我们的系统).处理这个的显而易见的方法是显式检查null并IllegalArgumentException在必要时抛出,但是,这将是不合理的冗长和手动.是否有更少的手动/更简洁的方式来做到这一点?
我有一个代码:
val d = Single
.zip<List<X>, Optional<Y>, DataContent>(
xSingle,
YSingle,
BiFunction { x, y ->
val b = if (y.isPresent()) {
y.get()
} else {
null
}
return@BiFunction DataContent(x, b)
})
.subscribe({ data ->
...
}, { t ->
...
})
Run Code Online (Sandbox Code Playgroud)
我听说,使用Optional检查示例中所示的空值是不好的做法。真的吗?为什么?有人可以展示使用的替代方案RxJava2吗?
是否可以记录返回值不是nullJava 的Optional?
大多数工具和框架只关心参数,但我想用返回值不是的类型来表达null(而不是在 JavaDoc 中这样做)。
UPDATE Looks line 你可以同意团队使用Optional作为返回值,如果你想表达可能null和直接的对象,当它绝对不为空时:
public Optional<Job> getJob() { ... }
public Job extractJob(NonNullJobHolder<Job> holder) { ... }
Run Code Online (Sandbox Code Playgroud) 我希望避免多种if-else情况。下面的代码有更简洁的写法吗?
private Set<String> getValues(Optional<String> one, Optional<String> two) {
if (one.isPresent() && two.isPresent()) {
return ImmutableSet.of(one.get(), two.get());
} else if (one.isPresent()) {
return ImmutableSet.of(one.get());
} else {
return two.isPresent() ? ImmutableSet.of(two.get()) : ImmutableSet.of();
}
}
Run Code Online (Sandbox Code Playgroud) 这是来自另一个StackOverflow问题的代码段:
@Override
public String convertToDatabaseColumn(final UUID entityValue) {
return ofNullable(entityValue).map(entityUuid -> entityUuid.toString()).orElse(null);
}
Run Code Online (Sandbox Code Playgroud)
我真的很难理解Optional类的使用.返回代码是"返回映射的值(String),还是NULL,如果失败?
如何返回作用于方法而不是类 - 即Optional.ofNullable()?
我尝试执行以下操作,但它不起作用
Optional<List<Integer>> listOne = someAPI.call()
// convert
Optional<ArrayList<Integer>> listTwo = new ArrayList<>(listOne); // doesn't work
Optional<ArrayList<Integer>> listTwo = Optional.of(new ArrayList(listOne)); // also not working
Run Code Online (Sandbox Code Playgroud)
请注意,第一个 API 返回Optional<List>. 我需要发送Optional<ArrayList>到另一个 API。
我遇到一个特定的用例,如果对象为空,我经常需要将它们包装起来Optional。看一下这段代码:
List<AbstractCorporateAction> cas = stream.toList();
if (cas.isEmpty()) return Optional.empty();
else return Optional.of(cas);
Run Code Online (Sandbox Code Playgroud)
我检查列表是否为空,如果确实为空,则返回一个空可选,如果不是,则将其包装。原因是有时我得到列表本身的空值,有时我得到一个实际的列表,但它是空的。
通过这种方法,当返回的可选本身为空时,我不需要仔细检查底层列表。
但对于不同的数据结构,实现方式有所不同。是否有第三方库的内置方法可以实现此目的?我得到的最接近的是 fromGuava.MoreObjects#isEmpty但它只检查对象是否为空,并且在它为空的情况下不返回可选值。
我可以为此编写自己的封面,但我正在寻找一种专业、可靠的方法来实现所需的功能。
instanceof如果我想要使用方法签名不同的不同验证器,如何避免在这种情况下使用和转换?
代码
for(BatchValidator validator : validators) {
try {
if (validator instanceof BatchErrorValidator) {
((BatchErrorValidator<T>) validator).validate(targets);
} else if (validator instanceof BatchWarningValidator) {
((BatchWarningValidator<T>) validator).validate(targets, header);
}
} catch (BatchValidationException e) {
handleImportExceptions(e, header.getSequenceId());
}
}
Run Code Online (Sandbox Code Playgroud) java ×11
option-type ×4
optional ×3
guava ×2
java-8 ×2
android ×1
arraylist ×1
instanceof ×1
jackson ×1
java-17 ×1
java-stream ×1
json ×1
kotlin ×1
list ×1
non-nullable ×1
null ×1
oop ×1
pointers ×1
rx-java2 ×1
set ×1
spring-boot ×1
types ×1