뿌우우 무난하게 흘러가던 나의 개발 여정. 하지만 늘 고난은 있었죠.
Map, Optional, Stream, filter 무슨 개념인지 모르고 사용하던 당신! 바 로 나..
지금부터라도 확실하게 이해하고 넘어갑시다! 알고나면 더 머어찐 개발자!!
[주의] : 오늘 나오는 개념은 Java 8 이후 추가된 기능입니다.
Java 8 이전에 List에 담아 처리하던 것을 반복문(for each, for ) 문으로 하나씩 조회하면서 처리했지만
변화없이 똑같이 코드를 짜다 보니 불편하고 보기도 불편해.. 그래서 해결했다 Stream
Collection, Array, 등 연속된 데이터를 filter, match, map 등등 다양한 기능을 제공하여 더 편리하게 처리할 수 있습니다!
Collection 을 쓰지 이걸 왜쓰냐? 비교하는 내용은 다른 포스팅때.. ㅎㅎ 오늘은 어떻게 사용할지만 작성하겠다!
List<Integer> list = Arrays.asList(1,2,3,4);
// .stream() 을 작성하면 Stream 으로 변환된다.
//Stream
Stream<Integer> stream = list.stream();
stream.forEach(number -> System.out.println("값 ::: " + number));
그럼 반복문 사용해서 조회할때 이거 사용하면 돼?
그것뿐인줄 알어? Stream 의 기능들을 지금부터 보여주지
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
//Stream
Stream<Integer> stream = list.stream();
stream.filter(i -> i %2 ==0)
.forEach(number -> System.out.println("값 ::: " + number));
Arrow Function 을 조건으로 사용합니다.
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
//Stream
Stream<Integer> stream = list.stream();
stream.filter(i -> i %2 ==0)
.map(i-> i*2)
.forEach(number -> System.out.println("값 ::: " + number));
요소들을 정렬한다.
List<Integer> list = Arrays.asList(1,2,3,4,5,1,2,3,4,5);
//Stream
Stream<Integer> stream = list.stream();
stream.sorted()
.forEach(number -> System.out.println("값 ::: " + number));
이정도 사용법을 보면 대충 감이 온다. 맞아 내가 그렇다.
그럼 다음 개념!
Null 값을 포함하거나 하지 않을 수 있는 컨테이너 객체다.
실제로 개발을 하다 보면 null을 사용하면 오류가 발생할 가능성이 있는 메서드의 반환 유형으로 사용하기 위해 사용한다. Optional 인 변수는 자체적으로 null이 아니어야 한다. 항상 Optional 인스턴스를 가리켜야 한다.
실제로 NPE ( Null Point Exception ) 을 처리할때 사용하기도 한다. 아래 코드를 한번 살펴볼까?
Map<Integer,String> name = new HashMap<>();
name.put(1,"철수");
name.put(2,"영희");
name.put(3, "길동");
//Optional X
String searchName = name.get(4); // null 발생
if(searchName == null){
new Exception("값이 없습니다.");
}else{
System.out.println("이름 ::: " + searchName);
}
// Optional O
Optional<String> nameOptaionl = Optional.ofNullable(name.get(4));
nameOptaionl.orElseThrow(() -> new Exception("값이 없습니다."));
System.out.println("이름 ::: " + nameOptaionl.get());
Optional<Integer> optional = Optional.of(1);
System.out.println(optional.get());
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8);
Optional<Integer> optional = Optional.ofNullable(list.get(9));
List<String> list = Arrays.asList("김범수","나얼","박효신","이수", null);
System.out.println("단어 ::: " + Optional.ofNullable(list.get(4)).orElse("없음"));
List<String> list = Arrays.asList("김범수","나얼","박효신","이수", null);
System.out.println("단어 ::: " + Optional.ofNullable(list.get(4)).orElseGet(() -> "데이터 없음"));
get : Optional 안에 존재하는 값을 가져옴
orElseThrow : 포함된 값이 있으면 반환하고 아닌 경우 예외 발생시킨다.
IsPresent : 내부 객체가 null 인지 아닌지를 판단 ( boolean )
[Refence] https://velog.io/@gjrjr4545/JAVA-8-3-Stream-Optional%EC%9D%98-%EB%93%B1%EC%9E%A5