본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Java(자바)

Java 1.8 Optional 그리고 stream

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2019. 5. 20.

 

 

자바가 버전업이 되면서 (JDK 1.8 이상) 기존의 길게 쭈욱 늘려서 썻던 코드들이 짧아지고 있다.

대표적인 기능 강화로는 3가지 정도이다.

 1. 람다 표현식 : 함수형 프로그래밍

 2. 스트림 API : 데이터의 추상화

 3. java.time 패키지 : 새로운 날짜와 시간 API

람다는 자바스크립트에서 통상 많이 사용했었는데..예를들어 이런코드를 말한다.

var array = [1,2,3,4,5];
array.forEach( arg ->{
    console.log(arg);
});

그리고 스트림은 java.util.Arrays 패키지에 있는 녀석으로 자바스크립트처럼 foreach, map, filter 등의 기능을 지원 해 준다. 이름도 비슷한데..사실 기능도 비슷하다.

 

Optional과 stream을 활용해서 이전에 복잡했던 코드를 줄여보았다.

//기존 1.7이하 스타일들
String arg = null;
int num = 0;
if(arg != null){
    num = Integer.parseInt(arg);
} else {
    num = -1;
}
System.out.println(num);
		
//1.8 이상부터 사용 가능한 스타일
int chagne = Optional.ofNullable(arg).map(Integer::parseInt).orElse(-1);
System.out.println(chagne);        

첫번째 부분은 기존에 if를 활용해서 null을 체크하는 소스이다. 기존 소스코드의 복잡한 라인이 1줄로 바뀐 것을 볼 수 있다. Optional은 java.util.Optional에서 지원하는 클래스이며 제네릭을 통한 다양한 자료형을 받을 수 있게 해준다.

ofNullable은 해당 arg가 널인지 체크를 해주고, map이라는 메소드를 통해서 데이터를 가공한 다음 orElse를 통해서 만약 null이면 -1을 리턴하게 해 주었다.

 

위 내용을 토대로 어떠한 절차식 코딩을 한 다면 ifPresent를 활용하면 된다.

String arg = "hello world";
Optional.ofNullable(arg).ifPresent((res)->{ // null이면 아래 출력문이 실행되지 않는다.
    System.out.println("not working : " + res);
});	

 

또 하나의 매력적인 기능이 stream을 활용한 Collection 데이터 가공의 편리성이다.

첫번째 소스코드에서 map을 사용했는데 아래 코드에서는 filter를 사용하여 보았다.

아래코드를 보면,

String[] str_array = {"item1","item2","item3","item4","item5"};  //item2만 삭제하고 싶다는 가정
		
str_array = Arrays.stream(str_array).filter((item)->{  //필터를 통한 item2 제거
    return item.equals("item2")? false : true;  //false면 데이터 소거
}).toArray(String[]::new);  //배열값으로 전환
		
for(String str : str_array){  //출력
    System.out.println(str);
}

알다시피 JAVA에서 일반 배열을 제거 또는 수정 하려면 "검색"을 통한 소스코드를 찾아 내야한다;;

Collection의 ArrayList나 map 같은 경우에는 편한 메소드를 제공하지만 일반 배열은 삭제랑 수정이 좀 어려운(?) 편이기 때문이다. Java 1.8이 괜히 각광받는게 아닌 것 같다.

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글