如何在 Java 8 中过滤 Optional.empty

cod*_*r25 1 java optional java-8

我想用 0 过滤值以打印无效的消息,但结果是 Optional.empty

 Long l = 0L;
 Optional<String> l2 = Optional.of(l).filter(t -> t>0).map(t ->t.toString());
 Optional<String>l3 =l2.filter(String::isEmpty).map(t ->"invalid");
 System.out.println(l3);
Run Code Online (Sandbox Code Playgroud)

需要返回类型是 Optional<String>

预期产出 -Invalid
实际产出 -Optional.empty

更新

需要返回类型是 String

预期产出 -Invalid value 0
实际产出 -Optional.empty

YCF*_*F_L 6

无需使用 Optional 或过滤器,您只需要:

String l3 = l > 0 ? l.toString() : "Invalid";
Run Code Online (Sandbox Code Playgroud)

如果要处理空值,则:

String l3 = (l != null && l > 0) ? l.toString() : "Invalid";
Run Code Online (Sandbox Code Playgroud)

如果要在 Invalid 情况下显示数字,则:

String l3 = (l != null && l > 0) ? l.toString() : String.format("Invalid %d", l);
Run Code Online (Sandbox Code Playgroud)

  • @coder25 但是*为什么*它首先在那里?如果您的目标(基于您的问题现在的样子,不确定这是否是您的“真正的”目标)可以通过上面答案中显示的更简单的方式实现,为什么要涉及可选? (3认同)
  • @coder25 抱歉,但我不明白。这就像说“它在那里是因为它在那里”,但并没有给我们带来太多信息。通常事情在某个地方是因为有人决定它应该在那里,我询问该决定背后的原因(为什么有人 - 代码作者,可能是你 - 尽管那个可选必须在那个地方使用?)。 (2认同)