如何处理findAny()。get()中的异常

问题描述 投票:1回答:3

在下面的代码中,如果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);
    }
}
java java-8 java-stream optional nosuchelementexception
3个回答
2
投票

您可以使用getOrDefault(Object key, V defaultValue) API。它用于获取与指定键映射的值。如果没有使用提供的键映射任何值,则返回默认值,如下所示:

getOrDefault(Object key, V defaultValue)

0
投票

您几乎在那里:

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本身。


-1
投票

这里是您不需要流通过比较键与忽略大小写从Map获取值或默认值的另一种选择。您可以将nullTreeMap一起使用并通过忽略大小写来比较密钥]

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
© www.soinside.com 2019 - 2024. All rights reserved.