List<Person>같은 컬렉션을 가지고 있을 때 Person클래스의 특정필드만을 가지고 새로운 리스트를 만들고 싶었습니다. for문으로 돌면서 새로운 리스트를 만들어도 되지만 Guava를 쓰면 쉽게 만들 수 있었습니다.
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | // Person.java package kr.sideeffect; public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } |
지난번 Ordering에 대한 포스팅에서도 사용했던 Person클래스입니다.(새로 만들기가 귀찮아서...) Guava에는 List<F>를 List<F>로 바꿔주는 Lists.transform함수를 제공하고 있는데 정의는 다음과 같습니다.
Java
1 2 3 4 5 | public static <F,T> List<T> transform( List<F> fromList, Function<? super F,? extends T> function ) |
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | // PersonTest.java package kr.sideeffect; import static org.junit.Assert.*; import java.util.ArrayList; import java.util.List; import org.junit.Test; import com.google.common.base.Function; import com.google.common.collect.Lists; public class PersonTest { @Test public void 필테스트() throws Exception { // given Person p1 = new Person("Outsider", 32); Person p2 = new Person("nephlim", 40); Person p3 = new Person("Anarcher", 35); Person p4 = new Person("fupfin", 43); Person p5 = new Person("Arawn", 33); List<Person> list = new ArrayList<Person>(); list.add(p1); list.add(p2); list.add(p3); list.add(p4); list.add(p5); // when Function<Person, String> nameFilter = new Function<Person, String>() { public String apply(Person person) { return person.getName(); } }; List<String> result = Lists.transform(list, nameFilter); // then assertEquals(result.size(), 5); assertEquals(result.get(0), p1.getName()); } } |
list는 ArrayList였지만 transform이 리턴해주는 리스트는 ArrayList는 아닙니다. 디버그로 찍어보면 위처럼 나오는데 정확한 타입은 잘 모르겠네요. 이를 ArrayList로 변환하려면 다음과 같이 작성할 수 있습니다.
Java
1 2 | // ArrayList로 변환 List<String> result = Lists.newArrayList(Lists.transform(list, nameFilter)); |
Java
1 2 3 4 5 6 7 8 9 10 | Function<Person, String> nameFilter = new Function<Person, String>() { public String apply(Person person) { return person == null ? null : person.getName(); } }; List<String> result = Lists.newArrayList(Iterables.filter( Iterables.transform(list, nameFilter), Predicates.<String>notNull() )); |
즉흥적으로 찾아보면서 쓰고 있는지라 제대로 쓰고 있는지는 잘 모르겠네요 Lists.transform외에도 Iterables.transform, Iterators.transform, Collections2.transform등이 존재하는데 제대로 안서봐서 차이점들은 잘 모르겠습니다.
댓글 없음:
댓글 쓰기