본문 바로가기

Language/Java

[Java]Collection 객체 응용(2)

1. 리스트를 join을 이용하여 문자열로 바꿀때는 stream().collect를 이용하자!

private static final List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

다음과 같은 리스트가 있을때

1-2-3-4-5-6-7...-10 과 같은 문자열을 반환받고 싶다면 일반적으로는 다음과 같다.

	    final StringBuilder stringBuilder1 = new StringBuilder();
	    final int size = numbers.size();  
	    for (int i = 0; i < size; i++) {  
	      stringBuilder1.append(numbers.get(i));  
	      if (i != size - 1) {  
	        stringBuilder1.append(" : ");
	      }
	    }

StringBuilder를 이용하여 append로 값과 : 를 하나씩 추가한다.

마지막 인자에서는 :를 추가하지 않기 때문에 if문을 이용하여 처리한다.

 

이 같은 코드를 foreach로 표현하면 다음과 같아져야 한다.

	    final StringBuilder stringBuilder = new StringBuilder();
	    final String separator = " : "; 
	    for (final Integer number : numbers) { 
	      stringBuilder.append(number).append(separator); 
	    }
	    final int stringLength = stringBuilder.length(); 
	    if (stringLength > 0) { 
	      stringBuilder.delete(stringLength - separator.length(), stringLength);
	    }

더 복잡해졌다.

모든 경우에 append 한 후에

최종 값에서

StringBuilder.delete(자르는 시작 값(inclusive), 자르는 끝값(exclusive))를 이용하여 마지막 " : " 만 자른다.

 

스트림을 이용한다면 아주 쉽게 문제를 해결할 수 있다.

	    final String result = numbers.stream()
	                                 .map(String::valueOf)      
	                                 .collect(joining(" : ")); 

스트림 객체로 전환 후에, map을 이용하여 Integer인 값을 String.valueOf로 캐스팅한다.

이후에 collect()를 이용하여 문자열을 만드는 메소드중 joining()을 이용하여 반환한다.

 

 

'Language > Java' 카테고리의 다른 글

[Java8]Functional Interface  (0) 2019.04.14
[Java8] Strategy Pattern, FP, 1급 객체  (0) 2019.04.14
[Java]Comparable, Comparator  (0) 2019.04.14
[Java]Collection 객체 응용(1)  (0) 2019.04.12
[Java] 자바 람다식  (0) 2019.04.09