在下面的代码中,如果queueName更改为TEST
(或任何不在映射中的名称,然后在java.util.NoSuchElementException: No value present
行获取异常.get();
代码适用于地图中的值。
关于不在地图中的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);
}
}
您可以使用getOrDefault(Object key, V defaultValue)
API。它用于获取与指定键映射的值。如果没有使用提供的键映射任何值,则返回默认值,如下所示:
getOrDefault(Object key, V defaultValue)
您几乎在那里:
String jmsReplToQueueName = headers.getOrDefault("TEST", "default");
[方法String jmsReplToQueueNameOp = headers.entrySet()
.stream()
.filter(header -> header.getKey().equalsIgnoreCase(queueName))
.map(jmsReplToQueue -> jmsReplToQueue.getValue())
.findAny() // Optional<String>
.getOrDefault("Test","default"); // String
已经返回Stream::findAny
,因此不需要构造一个新的。方法Optional
返回值Optional::getOrDefault
(如果存在)(不是Optional::get
),否则返回默认值。这意味着null
永远不会是jmsReplToQueueNameOp
本身。
这里是您不需要流通过比较键与忽略大小写从Map获取值或默认值的另一种选择。您可以将null
与TreeMap一起使用并通过忽略大小写来比较密钥]
CASE_INSENSITIVE_ORDER
然后简单地使用Map<String, String> headers =
new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
headers.put("JMS_REPLY_TO_QUEUE", "reply");
headers.put("ERROR_QUEUE", "error");
headers.put("RETRY_QUEUE", "retry");
headers.put("OK_QUEUE", "ok");
作为默认值
getOrDefault