【发布时间】:2020-04-12 14:05:07
【问题描述】:
在下面的代码中,如果 queueName 更改为 TEST(或任何不在地图中的名称),则在第 .get(); 行获取异常 java.util.NoSuchElementException: No value present
代码正在为地图中的值工作。
请求关于如何有效处理此案例的建议,queueName 不在地图中。
public class Optional3 {
public static void main(String[] args) {
Map<String, String> headers =
new HashMap<String, String>();
headers.put("JMS_REPLY_TO_QUEUE", "reply");
headers.put("ERROR_QUEUE", "error");
headers.put("RETRY_QUEUE", "retry");
headers.put("OK_QUEUE", "ok");
String queueName = "JMS_REPLY_TO_QUEUE"; //working
//String queueName = "TEST"; //not working
Optional<String> jmsReplToQueueNameOp = headers.entrySet()
.stream()
.filter(header -> header.getKey().equalsIgnoreCase(queueName))
.map(jmsReplToQueue -> jmsReplToQueue.getValue())
.map(Optional::ofNullable)
.findAny()
.get();
String jmsReplToQueueName = jmsReplToQueueNameOp.isPresent() ?
jmsReplToQueueNameOp.get() :
"default";
System.out.println(jmsReplToQueueName);
}
}
【问题讨论】:
-
只需从您的管道中删除
.map(Optional::ofNullable)和.get()... 您的倒数第二个语句也不需要比String jmsReplToQueueName = jmsReplToQueueNameOp.orElse("default");更复杂 -
将
.map(Optional::ofNullable)替换为.filter(e -> e != null)。这应该可以解决它。 -
感谢@ernest_k,解决方案有效
标签: java java-8 java-stream optional nosuchelementexception