Guava에서 자주 사용하는 Maps api


http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Maps.html



Map을 생성/변환한다. TreeMap을 생성할 경우 Comparator나 SortedMap을 인자로 받을 수 있다.


Maps.newLinkedHashMap();

Maps.newTreeMap();

Maps.newTreeMap(Collections.reverseOrder());

Maps.newTreeMap(String.CASE_INSENSITIVE_ORDER)

Maps.newHashMapWithExpectedSize(2);

Maps.newConcurrentMap();



Maps.filter*() 또는 Maps.uniqueIndex() 는 함수(function) 메소드를 사용해서 map의 submap을 얻어올 수 있으며,

properties에서 바로 map으로 읽어오는 Maps.fromProperties()도 있다. 




import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.apache.commons.collections.MapUtils;
import org.junit.Test;

import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;


public class MapsTest {
@Test
public void test() {

class Member {
int id;
String
name;
String
phone;

public Member(int id, String name, String phone) {
this.id = id;
this.name = name;
this.phone = phone;
}

@Override
public String toString() {
return com.google.common.base.Objects.toStringHelper(this).add("id", id).add("name", name).add("phone", phone).toString();
}
}

List<Member>
members = Lists.newArrayList();
members.add(new Member(3, "Kaley", "222"));
members.add(new Member(4, "Yong", "333"));
members.add(new Member(1, "Samuel", "000"));
members.add(new Member(0, "Jason", "111"));

Map<Integer, Member>
memberById = Maps.uniqueIndex(members, new Function<Member, Integer>() {
@Override
public Integer apply(Member member) {
return member.id;
}
});

MapUtils.debugPrint(System.
out, "member by id ", memberById);

// filterKey, filterValue도 비슷한 형태
Map<Integer, Member>
filteredMemberById = Maps.filterEntries(memberById, new Predicate<Map.Entry<Integer, Member>>() {
@Override
public boolean apply(Map.Entry<Integer, Member> input) {
return input.getValue().name.contains("Yong");
}
});

MapUtils.debugPrint(System.
out, "filted member by id ", filteredMemberById);
}

@Test
public void mapsPropertiesTest() {
Properties
properties = new Properties();
properties.put("replicated.cache.url", "redis://1.1.1.2/0");
properties.put("origin.cache.url", "redis://1.1.1.1/0");

Map<String, String>
maps = Maps.fromProperties(properties);
MapUtils.debugPrint(System.
out, "map from properties", maps);
}
}


결과

map from properties = 

{

    replicated.cache.url = redis://1.1.1.2/0 java.lang.String

    origin.cache.url = redis://1.1.1.1/0 java.lang.String

} com.google.common.collect.RegularImmutableMap

member by id  = 

{

    3 = Member{id=3, name=Kaley, phone=222} com.google.tag.location.MapsTest$1Member

    4 = Member{id=4, name=Yong, phone=333} com.google.tag.location.MapsTest$1Member

    1 = Member{id=1, name=Samuel, phone=000} com.google.tag.location.MapsTest$1Member

    0 = Member{id=0, name=Jason, phone=111} com.google.tag.location.MapsTest$1Member

} com.google.common.collect.RegularImmutableMap

filted member by id  = 

{

    4 = Member{id=4, name=Yong, phone=333} com.google.tag.location.MapsTest$1Member

} com.google.common.collect.Maps$FilteredEntryMap



Maps.filterValues()도 쓰인다. null이 아닌 것만 저장하고 싶을 때, Predicate 클래스를 활용하여 사용할 수 있다. 


objectMap = Maps.filterValues(objectMap, new Predicate<Object>() {
  @Override
        public boolean apply(Object object) {
       
return object != null;
}
});





Posted by '김용환'
,