본문 바로가기

Java

guava Lists.transform

요즘 많이 사용하는 라이브러리중 하나가 Guava인데요

Guava의 Lists.transform 사용시 주의(?)해야 하는 부분이 하나가 있습니다.


오늘 코드리뷰를 동료와 하다가 발견한 부분인데요...


Lists.transform을 사용하는 경우 TransformingRandomAccessList 객체가 반환되는데요

이 List 구현체는 일반적으로 알고 있는 ArrayList와는 조금 다르게 동작합니다.




1번의 transform 메서드의 결과가 어떻게 나올까요?

우리가 알고있는 일반적인 ArrayList라면 기존에 가지고 있던 1,2,3 String에 "11"이 붙어서

결과가 나와야하지만 실제로 돌려보면 1,2,3이 나옵니다.


그럼 구현체를 볼까요?


  @Override public T get(int index) {
return .apply(.get(index));
   }

function.apply를 사용해서 return합니다.


바로 transform에서 넘겨준 Function 객체를 들고 있다가 실제 객체가 요청될때 transform을 처리하여 주는 것이죠.

지연처리를 내부적으로 구현한 List입니다.


때문에 일반적인 ArrayList를 사용하듯이 안의 객체를 get으로 꺼내어 값을 setting하면서 List가 들고있는 객체의 값이

변경될거라고 생각하고 사용하면 큰 낭패를 보게됩니다.


transform의 결과를 일반적인 ArrayList로 받고 싶은 경우에는 Itrables.transform을 사용하면 됩니다.