웹 개발 메모장

[자바] 자바8 맛보기 본문

옛날../자바

[자바] 자바8 맛보기

도로롱주 2018. 7. 19. 18:21





자바8 맛보기



벌써 자바10까지 나왔지만 자바를 잘 사용하지 않아서 자바8에서 추가된 내용에 대해 최근에야 알게됬습니다.


함수형 인터페이스의 사용입니다.


예를 들어


1
List<Integer> numList = Arrays.asList(10008000300040002000);
cs


이렇게 1000, 8000, 3000, 4000, 2000 을 요소로 갖는 List가 있을 때



"1000원, 8000원, 3000원, 4000원, 2000원" 이러한 문자열을 출력하기 위한 코드를 작성해봅시다.


이전에는 다음과 같이 작성했었습니다.


1
2
3
4
5
6
7
StringBuilder sb = new StringBuilder();
                
for(int num : numList) {
    sb.append(num).append("원, ");
}
if(numList.size() > 0)
    sb.delete(sb.length()-", ".length(), sb.length());
cs


코드 내용은 아래와 같은데

1. 문자열을 다루기 위해 StringBuilder 객체를 생성하고


2. List를 반복문으로 돌려서 각 리스트 요소에 "원, "를 붙이고


3. 마지막 요소에 붙어있는 ", "를 제거한다.


복잡해질수록 가독성이 떨어지고 실수할 가능성이 커집니다.




자바8에서 추가된 방식을 사용하면 아래와 같은 코드로 짤 수 있습니다.


1
2
3
4
String str = numList.stream()
        .map(String::valueOf)
        .map((s) -> s+="원")
        .collect(Collectors.joining(", "));
cs


이전 방식보다 상당히 직관적입니다.


1. .stream()

리스트의 요소들을 연산 할 수 있도록해주고


2. .map(String::valueOf)

Integer 인 요소들을 문자열로 바꾸기위해

요소 = String.valueOf(요소) 를 해주고


3. .map((s) -> s+="원")

요소 += "원" 으로 "원"을 붙여주고


4. .collect(Collectors.joining(", "));

요소들을 ", "로 조인해준다.



추상메소드를 하나만 포함하는 인터페이스를 functional 인터페이스라고 부르며

이를 통해 함수를 값으로? 주고 받는 듯한 형태가 추가된 것으로 보입니다.


위에서 보이는 .map(String::valueOf) 를 살펴보면

map( )java.util.Function 이라는 funtional 인터페이스를 인자로 받도록 되어있고

int 를 인자로 받고 String을 반환하는 String.valueOf(int i) 메소드를 인자로 넘긴 형태입니다.

클래스가 가지는 static 메소드를 :: 을 이용해 접근하면 메소드가 반환하는 값이 아닌 메소드 자체를 전달할 수 있게 된 것 같습니다.



Comments