프로그래밍 언어/Java

Java에서 Iterator를 List로 변경하는 방법

코딩하는흑구 2022. 9. 22. 17:52

안녕하세요. 

 

업무하는 도중에 JsonNode 인스턴스를 다루었는데 해당 json의 field name들을 List로 가져와야 하는 일이 있었습니다.

 

이 때,  

jsonNode.fieldNames()

해당 코드가 반환타입이 Iterator<String> 이었고 이를 List<String> 타입으로 변환이 필요하여 찾아보았고 업무를 종료하고 정리를 해두면 다른분들도 결정하실때 좋을 것 같아서 공유합니다.

 


 

JsonNode jsonNode = ...;
Iterator<String> fieldNameIterator = jsonNode.fieldNames();

해당 iterator 변수를 List 타입으로 바꾸어 보자!

 

반복문(for, while 등)

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

가장 간단하고 쉽게 떠올릴만한 기본적인 방법. iterator를 돌면서 list를 채운다. 어찌보면 직접 구현하는 방법.

 

JAVA 8 Iterator.forEachRemaining

List<String> fieldNameList = new ArrayList<>();
fieldNameIterator.forEachRemaining(fieldNameList::add);

Java 8 혹은 그 이상의 버전에서는 iterator 타입의 forEachRemaining 메소드를 활용하면 List를 채울 수 있다. forEachRemaining 메소드의 참조로 add() 메소드를 전달하면 해당 iterator 인스턴스의 제네릭 타입의 value를 add하게 된다.

 

 

JAVA 8 Stream API

Iterable<String> iterable = () -> fieldNameIterator;
List<String> fieldNameList = StreamSupport.stream(iterable.spliterator(), false)
      .collect(Collectors.toList());

우선 stream API를 활용하는 형태에서는 Iterator 타입을 Iterable 타입으로 변경해야 합니다. StreamSupport 클래스를 활용하여 stream을 열고 list로 만드는 패턴을 활용합니다.

 

Guava

List<String> fieldNames = ImmutableList.copyOf(fieldNameIterator); // ImmutableList를 활용하여 불변 List 생성.
List<String> fieldNames = Lists.newArrayList(fieldNameIterator); // Lists 클래스의 newArrayList를 활용하여 가변 List 생성.

ImmutableList 클래스를 활용하여 불변 List 객체를 만들 수 있고, Lists.newArrayList를 활용하여 가변 List 객체를 만들 수 있다.

 

Apache Commons IteratorUtils Class

List<String> fieldNames = IteratorUtils.toList(fieldNameIterator);

IteratorUtils 클래스의 toList를 활용할 수 있다. 이 방법이 제가 선택한 방법인데 가장 심플하고 깔끔하게 정리할 수 있는 코드라서 선택하게 됐습니다.

 


이런 단순한 컨버팅하는 부분은 지저분하게 비즈니스 코드와 엮일 필요가 없이 별도의 static 함수로 만들거나 라이브러리의 도움을 받는 것이 제일 깔끔한 코드를 작성하는 방법이라고 생각합니다. 따라서 구현을 직접하시더라도 IteratorUtils 클래스를 직접 만들어서 마치 라이브러리의 도움을 받는 코드인 척하거나 private 메소드 한줄의 코드로 변경을 표현하는 것이 가장 좋은 방법이라고 생각합니다.

 

감사합니다.