본문 바로가기
Today I learned

2021 11 20 혼돈의 Optional 훈련

by soheemon 2021. 11. 20.

자. 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을 효과적으로 다룰수 있단다! 이제 코드를 한번 짜보렴!' 이라고 하는것같다.

나는 나는... 작은 시골쥐인데....

 

연습만일 살길이다.

댓글