Optional 의 Map, flatMap 사용하기
- Coding/Java
- 2021. 8. 8.
반응형
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
- 2) flatMap
Optional<String> getPersonName = optProduct.flatMap(Product::getPerson)
.flatMap(Person::getJob)
.map(Job::getJobName);
"dev" 가 출력되는것을 확인할 수 있다.
System.out.println(getPersonName);
반응형
'Coding > Java' 카테고리의 다른 글
스트림/람다식 사용하여 가장 긴 문자열 추출하기 (0) | 2021.10.18 |
---|---|
[Java8 람다식] Function interface 간단 예제 (0) | 2021.10.12 |
Optional 선언하기 (빈 Optional, NULL 가능 여부에 따른 Optioanl) (0) | 2021.08.08 |
Stream 로깅 처리하기 (0) | 2021.08.07 |
[Java8] Map의 key 가 null 일 경우 처리 방법 (0) | 2021.08.02 |