Optional 사용방법

카테고리 없음|2020. 8. 25. 12:18


import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.function.Supplier;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class OptionalTest {
/*Java Optional 클래스는 Java 8에서 추가되었으며 자바의 고질적인 문제인 NullpointerException 문제를 해결할 수 있는 방법을 제공
* 객체 감싸는 역활 Wrapper class */

@Test
public void 값이널이아닐때of() {
String name = "dongkyu";
Optional<String> opt = Optional.of(name);
//assertEquals("Optional[dongkyu]", opt.toString());
Assertions.assertThat(name).isEqualTo("dongkyu");
}

@Test
public void 값이널일때of() {
String name = null;
Optional<String> opt = Optional.of(name); //of으로 데이터를 가져올 경우 NullPointerException 발생
//assertEquals("Optional[dongkyu]", opt.toString());
Assertions.assertThat(name).isEqualTo("dongkyu");
}

@Test
public void 값이널아닐때ofNullable() { //값이 무조건 null이 아닌 값을 사용하는 경우
String name = "dongkyu";
Optional<String> opt = Optional.ofNullable(name); //null일경우 Optional.empty 출력
System.out.println("######" + opt.toString());
Assertions.assertThat(opt.toString()).isEqualTo("Optional[dongkyu]");
}

@Test
public void 값이널일때ofNullable() { //값이 null 들어올 수 있을 경우 사용
String name = null;
Optional<String> opt = Optional.ofNullable(name); //null일경우 Optional.empty 출력
System.out.println("######" + opt.toString());
Assertions.assertThat(opt.toString()).isEqualTo("Optional.empty");
}

@Test
public void 값이널인지아닌지파악하기() {
String name = "dongkyu";
Optional<String> opt = Optional.ofNullable(name); //null일경우 Optional.empty 출력

//System.out.println("######"+opt.isPresent());
Assertions.assertThat(opt.isPresent()).isTrue(); //null이 아닐 경우 true 반환
// Assertions.assertThat(opt).isNotEmpty();
}

@Test
public void optional사용전asis() {
String name = "dongkyu";

if (name != null) {
System.out.println("######" + name.length());
}

}

@Test
public void optional사용후tobe() {
Optional<String> opt = Optional.ofNullable("dongkyu");
opt.ifPresent(name -> System.out.println("######" + name.length()));
}


@Test
public void optional없을때사용법() {
ArrayList<String> names = new ArrayList<>();
names.add("dongkyu");
names.add(null);
names.add("soo");

for (String name : names) {
if (name != null) { //사용하지 말라고 권고함
System.out.println("######" + name.length());
}
}
}

@Test
public void optional권장사항() {
ArrayList<String> names = new ArrayList<>();
names.add("dongkyu");
names.add(null);
names.add("soo");

for (String name : names) {
Optional<String> opt = Optional.ofNullable(name);
opt.ifPresent(n -> System.out.println("######" + n.length()));
}
}

@Test
public void optionalorElse처리() { //orElse 사용 - null체크와 기본값 셋팅
String nullName = null;
String name = Optional.ofNullable(nullName).orElse("dongkyu");
Assertions.assertThat(name).isEqualTo("dongkyu");
//assertEquals("dongkyu",name);
}

public String defaultName() {
return "dongkyu";
}

@Test
public void optionalorElseGetValue처리() { //orElseGet 사용은 기본값을 method로 셋팅. orElseGet null일 경우에만 메소드 실행
String nullName = "DD";
String name = Optional.ofNullable(nullName).orElseGet(this::defaultName);
System.out.println("####" + name);
Assertions.assertThat(name).isEqualTo("dongkyu");
//assertEquals("dongkyu",name);
}

@Test
public void optionalorElseGetNull처리() { //orElseGet 사용은 기본값을 method로 셋팅. orElseGet null일 경우에만 메소드 실행
String nullName = null;
String name = Optional.ofNullable(nullName).orElseGet(this::defaultName);

Assertions.assertThat(name).isEqualTo("dongkyu");
//assertEquals("dongkyu",name);
}

//get orElseThrow 는 많이 사용 안함
@Test
public void optionNalCollection처리() {
List<String> names = Arrays.asList("dongkyu", null, "soo");
Optional<List<String>> listOptional = Optional.ofNullable(names);
int size = listOptional.map(List::size).orElse(0);
assertEquals(3, size);
}

public class Person{
private String name;
private int age;

public Person(String name) {
this.name = name;
}

public Person(String name, int age) {
this.name = name;
this.age = age;
}

public int getAge() {
return age;
}

public String getName() {
return name;
}
}

List<Person> people = new ArrayList<Person>();
public Optional<Person> findByName(String name) {
return people.stream()
.filter(p -> p.getName().equals(name))
.findAny();
}

@Test
public void optionNalCollection객체처리() {

people.add(new Person("dongkyu",10));
people.add(new Person("soo",20));
people.add(new Person("dan",10));


findByName("dongkyu").ifPresent(person -> System.out.println("##### 이름 : "+ person.getName()
+"###### 나이 : "+person.getAge()));
}


}

댓글()