Optional 의 Map, flatMap 사용하기

반응형
728x90
반응형

예제파일 DTO

  • 1) Product.java
package dto.Product;

import lombok.Getter;
import lombok.Setter;

import java.util.Optional;

public class Product {
    private int idx;
    private String productName;
    private int ordCnt;
    private int totalCnt;

    private Optional<Person> person;

    public int getIdx() {
        return idx;
    }

    public String getProductName() {
        return productName;
    }

    public int getOrdCnt() {
        return ordCnt;
    }

    public int getTotalCnt() {
        return totalCnt;
    }

    public Optional<Person> getPerson() {
        return person;
    }

    public void setPerson(Optional<Person> person) {
        this.person = person;
    }

    public Product(int idx, String productName, int ordCnt, int totalCnt) {
        this.idx = idx;
        this.productName = productName;
        this.ordCnt = ordCnt;
        this.totalCnt = totalCnt;
    }
}

 

  • 2) Person.java
package dto.Product;

import java.util.Optional;

public class Person {
    private int idx;
    private String personName;
    private Optional<Job> job;

    public int getIdx() {
        return idx;
    }

    public void setIdx(int idx) {
        this.idx = idx;
    }

    public String getPersonName() {
        return personName;
    }

    public void setPersonName(String personName) {
        this.personName = personName;
    }

    public Optional<Job> getJob() {
        return job;
    }

    public void setJob(Optional<Job> job) {
        this.job = job;
    }

    public Person(int idx, String personName) {
        this.idx = idx;
        this.personName = personName;
    }
}

 

  • 3) Job.java
package dto.Product;

public class Job {
    private int idx;
    private String jobName;

    public int getIdx() {
        return idx;
    }

    public void setIdx(int idx) {
        this.idx = idx;
    }

    public String getJobName() {
        return jobName;
    }

    public void setJobName(String jobName) {
        this.jobName = jobName;
    }

    public Job(int idx, String jobName) {
        this.idx = idx;
        this.jobName = jobName;
    }
}

 

 

Map 메서드 사용

  • 1) Before

product1 객체가 NULL 이 아닌 경우 getProductName() 메서드를 호출하여 선언한 변수 test 에 저장하는 코드이다. 

Product product1 = new Product(0, "Note_red", 1, 100);

String test = "";
if (product1 != null) {
	test = product1.getProductName();
}

 

  • 2) After

if 문 처리 없이 아래의 코드로 동일하게 실행할 수 있다. 만약 Optional<Product> 타입의 ofProduct 객체가 비어져있다면 아무일도 일어나지 않는다.

Optional<Product> ofProduct = Optional.ofNullable(product1);
Optional<String> name = ofProduct.map(Product::getProductName); // name 에 값을 넣는다. Optional 이 비어져있으면 아무일도 일어나지 않는다.

 

 

데이터 셋팅

Product product5 = new Product(0, "Note_red", 1, 100);
Person person = new Person(1, "seohae");
Job job = new Job(1, "dev");

Optional<Job> ofJob = Optional.ofNullable(job);
person.setJob(ofJob);

Optional<Person> ofPerson = Optional.ofNullable(person);
product5.setPerson(ofPerson);

Optional<Product> optProduct = Optional.of(product5);

 

 

여러 Map, FlatMap

  • 1) Map
Optional<String> getPersonName = optProduct.map(Product::getPerson) // Optional<Optional<Person>>
                                          .map(Person::getJob)
                                          .map(Job::getJobName);

 

위 코드는 컴파일 에러가 발생한다.

Product::getPerson
> 우리가 원한 결과 :  Optional<Person>
> 실제 결과 : Optional<Optional<Person>>

 

이러한 경우에 우리는 이전에 이미 flatMap을 사용해야한다고 배웠다. 해당 이유에 대해서는 아래 포스팅을 참고하자.

https://devfunny.tistory.com/458?category=878359 

 

[Java] List의 각 원소 고유문자 리턴하기 - Stream 평면화 과정 (flatMap 사용)

평면화 FlatMap List 의 요소에 속하는 모든 고유문자를 리스트로 리턴받고 싶다. 아래의 과정을 걸쳐서 스트림 평면화를 진행하는 flatMap을 이해해보자. 우선, 우리가 하고싶은 상황은 아래와 같다.

devfunny.tistory.com

 

  • 2) flatMap
Optional<String> getPersonName = optProduct.flatMap(Product::getPerson)
                                          .flatMap(Person::getJob)
                                          .map(Job::getJobName);

 

"dev" 가 출력되는것을 확인할 수 있다.

System.out.println(getPersonName);

 

 

반응형

Designed by JB FACTORY