java使用guava變形數據結構

在java平常開發中,常常須要使用各類數據結構,在涉及到數據結構之間如何優雅的轉換時,咱們能夠藉助google的guava提供的相關功能來優雅的實現。如下記錄一些開發中常常須要使用數據結構的變形,以便使用時方便查閱。 通常咱們的數據結構中存儲的爲對象,如下舉例先構造一個類,用來存放中不一樣的數據結構中。java

class Person {
    public String name;
    public int age;

    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;
    }

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(this).omitNullValues()
                .add("name", name)
                .add("age", age)
                .toString();
    }
}

提供一個方法來構造一個對象list數據結構

public static Collection<Person> queryPersion(){
        return Lists.newArrayList(
                new Person("kang",30),
                new Person("liu",25),
                new Person("han",22)
        );
    }
//某個屬性爲null
public static List<Person> queryPersion2(){
        return Lists.newArrayList(
                new Person("kang",30),
                new Person("liu",25),
                new Person("han",22),
                new Person(null,24)
        );
    }
  • 獲取一組對象中的某個屬性,存入一個list 使用Lists.transform實現
List<Person> persons = queryPersion();
        List<String> peopleNames = Lists.transform(persons, new Function<Person, String>() {
            @Override
            public String apply(Person person) {
                return person.getName();
            }
        });
  • 以優雅的方式過濾有null的值 Iterables.filter第二個參數支持傳入一個Predicate接口 Predicates 是 Guava 中與 Predicate 接口配套使用的工具類,提供了一些很是有用的工具類
Collection<Person> matchingPersons = queryPersion2();
        Collection<String> peopleNames =
                Lists.newArrayList(
                        Iterables.filter(
                                Iterables.transform(matchingPersons, new Function<Person, String>() {
                                    @Override
                                    public String apply(Person from) {
                                        return from.getName();
                                    }
                                }), Predicates.notNull()
                        )
                );
  • 使用filter過濾年齡大於25歲的人
Collection<Person> persons = queryPersion();
        List<Person> oldPeople = Lists.newArrayList(Iterables.filter(persons, new Predicate<Person>() {
            public boolean apply(Person person) {
                return person.getAge() >= 25;
            }
        }));
  • 將list數據結構變形爲map,將list中對象的某個屬性提取出來,變爲map中的key (開發中高頻使用) 須要注意的是這種使用方式,將list中某個對象的屬性變爲map的key時,該屬性不能重複或者爲null
//name重複或者name爲null時會報錯
Collection<Person> yourList = queryPersion();
        Map<String,Person> mappeds = Maps.uniqueIndex(yourList, new Function<Person,String>() {
            @Nullable
            public String apply(Person from) {
                // do stuff here
                return from.getName();
            }});
  • 將list數據結構變爲ImmutableListMultimap 若是list中某個對象的屬性會重複時,能夠使用以下方法轉換,但轉換的數據結構是一個ImmutableListMultimap,這是guava中提供的一個數據結構,簡單的能夠理解爲map中的value爲一個list
Collection<Person> yourList = queryPersion();
        ImmutableListMultimap<String, Person> mapping = Multimaps.index(yourList, new Function<Person,String>() {
            public String apply(Person input) {
                return input.getName();
            }
        });
  • 高效的建立list 在能夠預期一個list元素的個數時,能夠使用以下方式建立,避免list在擴容時,形成性能衰減。注意的是這裏只是傳入一個預期的元素個數,實際狀況中list中存放的元素個數並不須要徹底等於預期值
Lists.newArrayListWithExpectedSize(size);
相關文章
相關標籤/搜索