자. JAVA8 이전에는 null을 아래와 같이 처리했어요.
객체가 늘어나면 늘어날수록 if절이 늘어나서 몹시 보기가 좋지 않은 코드였죠.
// null 을 다루는 방법
Member sohee = new Member("sohee", null, 12);
//초창기
String userEmail = "";
if(sohee.getEmail() != null){
userEmail = StringUtils.toUpperCase(sohee.getEmail());
}else{
userEmail = "이메일이 존재하지 않습니다..";
}
System.out.println("초창기 null 처리 --> " + userEmail);
하!지!만! Optional.ofNullable에 어떠한 객체라도 넣으면 안에 있는 요 객체녀석이 null인지 아니면 null이 아닌지 알수 있습니다!
.orElse는 null이 아닐때 반환할 값을 의미해요. Optional<T>이기 때문에 아무 타입이나 받을 수 있겠죠?
우리는 Optional<String>을 반환했기 때문에 orElse에 String을 넣을 수 있다는 말씀!
//Optional을 반환한다.
String userEmail2 = Optional.ofNullable(sohee.getEmail())
.orElse("이메일이 존재하지 않습니다.");
System.out.println("ofNullable + orElse 처리 --> " + userEmail2);
orElse는 원하는 객체를 반환하지만, 우리는 null이 아닐때 메서드를 실행하고 싶을수도 있어요!
이럴땐 ifPresent를 사용하면 된답니다. 짜잔!@!@!@!@! isPresent는 null이 아닐때만 인자로 받은 람다식을 실행해요.
// ifPresent 값이 null이 아닐때만 실행.
Optional.ofNullable(sohee.getEmail())
.ifPresent(str -> System.out.println(str));
하지만 isPresent와 헷갈리지 말아요! isPresent는 Optional인자로 받은 객체가 null인지 아닌지 boolean값을 반환하니까요!
이점을 사용하면 stream + filter를 이용해서 null을 걸러낼 수 있죠 ^^^^
// 스트림과 null
List<Member> a = Arrays.asList(
new Member("1", "1@gmail", 1)
,null
,new Member("3", "3@gmail", 1)
,null
,new Member("5", "5@gmail", 12));
//stream에 중간중간에 null이 있다고 생각해보세요. 끔찍하네요 당연히 널포인터 익셉션 발생
//a.stream().f lter(m -> (m.getAge() > 2)).forEach(orderThan2 -> System.out.println(orderThan2.getName()));
// 얼렁뚱땅 지금까지 배운 내용으로 스트림에서 널을 제거 해보았습니다 헤헤헤 ㅠㅠ
a.stream().filter(member -> Optional.ofNullable(member).isPresent()).forEach(orderThan2 -> System.out.println(orderThan2.getName()));
어!떠한 객체던 Optional.ofNullable의 인자로 전달하면 Optional을 반환받는다.
이 Optional이 있으면 안에 들어있는 객체가 Null인지 뭔지 감지를 할 수 있으며 그에 따라서 동작을 할 수 있다.
마치 엄청 조은 연장들을 내앞에 두고 '자! 이걸 이용하면 Null을 효과적으로 다룰수 있단다! 이제 코드를 한번 짜보렴!' 이라고 하는것같다.
나는 나는... 작은 시골쥐인데....
연습만일 살길이다.
'Today I learned' 카테고리의 다른 글
2022 03 20 - 단축평가 (0) | 2022.03.20 |
---|---|
2022 03 19 - Promise 체이닝과 / async await (0) | 2022.03.19 |
20201 11 19 - 혼돈의 Optional (0) | 2021.11.19 |
2021 11 18 stream은 손에 안익네.. (0) | 2021.11.18 |
2021 11 18 실무에 어떻게 적용하면 좋을지 궁금한 functional interface (0) | 2021.11.18 |
댓글