zoukankan      html  css  js  c++  java
  • Google Guava14.0 瓜娃学习笔记

    Guava 是java api的增强与扩展,提供复杂的java 数据结构,使你的代码更简短精炼,具有良好的可读性。看看guava给我们提供了哪些很酷的功能:

    • 集合创建:
    Map<String, Map<String, String>> map = Maps.newHashMap();
    List<List<Map<String, String>>> list = Lists.newArrayList();
    • 集合初始化:
    Set<String> set = Sets.newHashSet("one","two","three");
    List<String> list = Lists.newArrayList("one","two","three");
    • Immutable Collections: 不可变的集合,还在使用 Collections.unmodifiableXXX() ? Immutable Collections 这才是真正的不可修改的集合
     ImmutableSet<String> immutableSet = ImmutableSet.of("RED", "GREEN");

    从构造的方式来说,ImmutableSet 集合还提供了 Builder 模式来构造一个集合 :

     Builder<String>  builder = ImmutableSet.builder(); 
     ImmutableSet<String> immutableSet = builder.add("RED").addAll(set).build();
    • MultiMap:一种key可以重复的map,子类有ListMultimap和SetMultimap,对应的通过key分别得到list和set
    Multimap<String, Person> customersByType =ArrayListMultimap.create();
    customersByType.put("abc", new Person(1, 1, "a", "46546", 1, 20));
    customersByType.put("abc", new Person(1, 1, "a", "46546", 1, 30));
    • Multiset:把重复的元素放入集合,并且可以统计重复元素的个数
    复制代码
    Multiset<Integer> multiSet = HashMultiset.create();
    multiSet.add(10);
    multiSet.add(30);
    multiSet.add(30);
    multiSet.add(40);
    
    System.out.println( multiSet.count(30)); // 2
    System.out.println( multiSet.size());    //4
    复制代码
    • Table:相当于有两个key的map。
    复制代码
    Table<Integer,Integer,Person> personTable=HashBasedTable.create();
    personTable.put(1,20,new Person(1, 1, "a", "46546", 1, 20));
    personTable.put(0,30,new Person(2, 1, "ab", "46546", 0, 30));
    
    // 得到行集合
    Map<Integer,Person> rowMap= personTable.row(0);
    int maxAge= Collections.max(rowMap.keySet());
    复制代码
    • BiMap:java.util.Map 只能保证 key 的不重复,BiMap 保证 value 也不重复,提供inverse()方法,可以通过key得到value,也可以通过value得到key
    //双向map
    BiMap<Integer,String> biMap=HashBiMap.create();
    biMap.put(1,"hello");
    biMap.put(2,"my");
    int value= biMap.inverse().get("my");
    • ClassToInstanceMap:有的时候,你的map的key并不是一种类型,他们是很多类型,你想通过映射他们得到这种类型,guava提供了ClassToInstanceMap满足了这个目的,除了继承自Map接口,ClassToInstaceMap提供了方法 T getInstance(Class<T>) 和 T putInstance(Class<T>, T),消除了强制类型转换。
    ClassToInstanceMap<Person> classToInstanceMap =MutableClassToInstanceMap.create();
    classToInstanceMap.putInstance(Person.class, new Person(1,20,"abc","46464",1,100));
    Person person = classToInstanceMap.getInstance(Person.class);
    • Predicate:谓词是一个简单的接口,只有一个方法返回布尔值,但是他是一个很令人惊讶的集合方法,当你结合collections2.filter方法使用,这个筛选方法返回原来的集合中满足这个谓词接口的元素。比如要按性别筛选:    
    复制代码
    Collections2.filter(personList,new Predicate<Person>() {
        @Override
        public boolean apply( Person input) {
            return input.getSex()==0;
        }
    })
    复制代码

      同时可以转换一个集合为另外一个集合:

    复制代码
    Lists.transform(personList,new Function<Person, String>() {
        @Override
        public String apply( Person input) {
            return input.getName();
        }
    })
    复制代码
    • MapMaker: 超级强大的 Map 构造类,是用来构造 ConcurrentMap 的工具类
    复制代码
    ConcurrentMap<String, Object> mapAll = new MapMaker() 
        .concurrencyLevel(8) 
        .softKeys() 
        .weakValues() 
        .expireAfterWrite(30, TimeUnit.SECONDS) 
        .maximumSize(100) 
        .makeComputingMap( 
          new Function<String, Object>() { 
            public Object apply(String key) { 
              return createObject(key); 
         }});
    复制代码
    • Ordering: 非常灵活的排序类,大家知道用 Comparator 作为比较器来对集合排序,但是对于多关键字排序 Ordering class 可以简化很多的代码
    复制代码
    Lists.newArrayList(30, 20, 60, 80, 10);
    Ordering.natural().sortedCopy(numbers); //10,20,30,60,80
    Ordering.natural().reverse().sortedCopy(numbers); //80,60,30,20,10
    Ordering.natural().min(numbers); //10
    Ordering.natural().max(numbers); //80
    Lists.newArrayList(30, 20, 60, 80, null, 10);
    Ordering.natural().nullsLast().sortedCopy(numbers); //10, 20,30,60,80,null
    Ordering.natural().nullsFirst().sortedCopy(numbers); //null,10,20,30,60,80
    复制代码
    复制代码
    List<Person> personList=Lists.newArrayList(
    new Person(3, 1, "abc", "46546", 0, 25),
    new Person(2, 1, "ab", "46546", 0, 30),
    new Person(5, 1, "ade", "46546",0, 27)
    );
    
    Ordering<Person> byAge = new Ordering<Person>() {
        @Override
        public int compare( Person left, Person right) {
            return right.getAge()-left.getAge();
        }
    };
    
    for(Person p: byAge.immutableSortedCopy(personList))
    {
        System.out.println(p);
    }
    
    复制代码
    复制代码
    // 使用ComparisonChain比较多字段

    Collections.sort(list, new Comparator<Foo>(){
        @Override 
        return ComparisonChain.start()  
             .compare(f1.a, f2.a, comparatorA)  
             .compare(f1.b, f2.b, comparatorB) 
             .compare(f1.c, f2.c, comparatorC).result(); 
     }});
    复制代码

    maven坐标:

    <dependency>
          <groupId>com.google.guava</groupId>
          <artifactId>guava</artifactId>
          <version>14.0-rc2</version>
    </dependency>

    对于开发人员来说,Guava 确实是一把利器,封装了许多实用的API,让我们编写代码更简单易读,这篇文章是我学习Guava的总结,希望大家能从中有所收获。

  • 相关阅读:
    迪杰斯特拉 优先队列 模板
    UVa 12186 树形dp
    树形dp总结
    codeforces 746C 模拟
    2017西安网络赛 F
    北京师范大学校赛C
    UVA 1584 字符串
    状压dp入门第一题 poj3254
    2017ICPC/广西邀请赛1005(水)HDU6186
    2017ICPC/广西邀请赛1001(水)HDU6181
  • 原文地址:https://www.cnblogs.com/diegodu/p/6119749.html
Copyright © 2011-2022 走看看