Как обработать исключение в findAny (). Get () - PullRequest
1 голос
/ 12 апреля 2020

В приведенном ниже коде, если 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);
    }
}

Ответы [ 2 ]

3 голосов
/ 12 апреля 2020

Вы можете использовать getOrDefault(Object key, V defaultValue) API. Он используется для получения значения, сопоставленного с указанным ключом. Если никакое значение не сопоставлено с предоставленным ключом, то значение по умолчанию возвращается как это:

String jmsReplToQueueName = headers.getOrDefault("TEST", "default"); 
0 голосов
/ 12 апреля 2020

Вот еще одна альтернатива, вам не нужен поток, чтобы получить значение или значение по умолчанию из Map, сравнивая ключ с игнорированием регистра. Вы можете просто использовать 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 по умолчанию значение

System.out.println(headers.getOrDefault("JMS_REPLY_TO_QUEUE", "default"));  //reply

System.out.println(headers.getOrDefault("JMS_rEPLY_TO_QUEUE", "default"));  //reply

System.out.println(headers.getOrDefault("jms_reply_to_queue", "default"));   //reply

System.out.println(headers.getOrDefault("JMSREPLY_TO_QUEUE", "default")); //default
...