NullSafe 하게 Optional 함수를 반환하는 방법에 대해서 알아보겠다.
일단, 반환값이 int / long / double 이라면 Optianl<> 을 사용하는 것보다 OptionalInt / OptionalLong / OptionalDouble을 사용하는 것이 좋다.
아래 예제의 getSumOfNum은 리스트에 특정 숫자를 포함한 원소를 필터링하여 총 합을 구하는 함수이다.
OptionalInt optionalSum = getSumOfNum("2"); Integer sumOfNum = optionalSum.orElse(0); // same as optionalSum == nul ? 0 : optionalSum; public static OptionalInt getSumOfNum(String n) { List<String> strNum = List.of("144", "234", "222", "555", "777"); Integer sumOfNum = strNum.stream() .filter(x -> x.contains(n)) .mapToInt( value -> Integer.parseInt(value)) .sum(); return sumOfNum == null ? OptionalInt.empty() : OptionalInt.of(sumOfNum); }
결론부터 말하면, Optional.ofNullable()의 사용을 지양하는 것이 Null-Safe한 방법이다.
총 합이 null이면 null이 아닌 OptionalInt.empty()를 반환해주고, null이 아니면 OptionalInt.of()를 반환 해준다.
함수를 사용하여 값을 받아오는 OptionalSum은 OptionalInt로 받아오고, sumOfNum에서 orElse()를 사용한다.
이로써 Optional.ofNullable()를 사용하지 않는 것이 Null-Safe 한 방법이다.
Optional에서는 Optional.of()는 Optional.ofNullable()과는 다르게 값이 null이 아님이 확실한 경우에만 사용한다. (null이 들어오면 NPE를 뱉는다.)