2016-12-13 4 views
4

Я пытаюсь проверить, если вход нуль, то результат должен быть пустым Или, если вход String, то он должен преобразовать его в Лонг вводаJava 8 Дополнительный Null Проверка

Предполагая, что никогда не «ABCD», ввод является либо нулевым, либо «12», «14» и т. д.

Следующий фрагмент кода генерирует исключение нулевой указатель, так как я не могу использовать Java 8 Необязательно. Я могу поймать исключение нулевого указателя или использовать if/else с третичным '?' оператора, но есть ли способ справиться с этим сценарием с опцией?

public class OptionalClass { 

public void methodA(String input) { 
    System.out.println(Long.valueOf(Optional.ofNullable(input).orElse(null))); 
} 

public static void main(String[] args) { 
    new OptionalClass().methodA("12");// This works fine 
    new OptionalClass().methodA(null); // This throws null pointer exception 
} } 
+1

* почему * вы хотите использовать опционально? Я не вижу никакой пользы для вашего дела. – GurV

+3

. На самом деле это не '' Факультативный'. И вы не хотите поймать NPE. Просто используйте третичный, хотя лучший дизайн заключается в том, чтобы сказать, что контракт просто не разрешает null - тогда бросание NPE - это то, что должно произойти, и происходит автоматически, а ваш код намного проще. – pvg

+2

Разве это не «тройной»? :-) IMO нет необходимости использовать опционально в вашем случае. Что-то вроде 'input! = Null? Long.valueOf (ввод): null' похоже ok. То, что @pvg говорит, также разумно. –

ответ

9

Использование map для преобразования из Optional<String> в Optional<Long>:

Optional<String> str = ...; 
Optional<Long> num = str.map(Long::valueOf); 

str Если был пуст, num тоже пусто. Если str имеет значение, num содержит результат valueOf. Это было бы полезно, если бы Optional<String> приходил откуда-то еще. Сделать так, чтобы избежать тройного оператора, вызывает сомнения, но вот как вы можете переписать свой метод:

public void methodA(String input) { 
    System.out.println(Optional.ofNullable(input).map(Long::valueOf).orElse(null)); 
} 
+0

Это было полезно. Это помогло мне лучше понять использование карты с опцией. Тройной оператор - лучший вариант, как вы упомянули выше для фрагмента кода, но ваш ответ будет полезен для других сценариев моего проекта, то есть за исключением преобразований от String to Long. – David

Смежные вопросы