본문 바로가기
Old Posts/Java

[Java] Iterable을 컬렉션(Collection)으로 바꾸는 방법

by A6K 2021. 4. 29.

자바 라이브러리를 사용하다보면 Iterable 객체를 받아와서 컬렉션(Collection) 객체로 바꿔 쓰고 싶은 경우가 많다. 그냥 일반적인 자바 소스코드로 작성해서 사용하는 방법도 있고, 구아바(Guava), Apache Commons 라이브러리를 이용한 방법이 있다.

Plain Java 코드

우선 Java8 이상의 JDK를 사용하는 경우 다음을 사용할 수 있다.

List<String> result = new ArrayList<String>();
iterable.forEach(result::add);

iterable 객체에서 제공하는 forEach() 메소드를 이용해서 list를 채워서 사용한다. 혹은 Spliterator 클래스를 이용해서 생성할 수도 있다.

List<String> result = 
	StreamSupport.stream(iterable.spliterator(), false)
    	.collect(Collectors.toList());

이전 버전의 자바를 사용하고 있거나 새로운 문법들이 눈에 잘 안들어온다면 전통적인 방법으로 for loop을 돌면서 채워도 된다.

List<String> result = new ArrayList<String>();
for (String str : iterable) {
    result.add(str);
}

아니면 hasNext() 메소드와 next() 메소드로 돌면서 채워도 된다.

List<String> result = new ArrayList<String>();
while (iterator.hasNext()) {
    result.add(iterator.next());
}

Guava 사용

만약 Guava 라이브러리를 사용하고 있으면 좀 더 짧은 라인으로 구현할 수 있다.

List<String> result = Lists.newArrayList(iterable);

만약 생성되는 리스트가 수정될 일이 없다면,

List<String> result = ImmutableList.copyOf(iterable);

이렇게 생성해도 된다.

Apache Commons 라이브러리 사용

Apache Commons 라이브러리에서는 IteratorUtils 라는 static 클래스를 통해 유틸성 메소드들을 지원한다.

List<String> result = IterableUtils.toList(iterable);

iterator 객체에도 적용할 수 있다.

List<String> result = IteratorUtils.toList(iterator);

직접 구현해서 사용해도 되고, Guava나 Apache 라이브러리를 쓰고 있다면 더 짧은 라인으로 원하는 동작을 구현할 수도 있다. 잘 가져다 쓰자.

댓글