`
iamzhongyong
  • 浏览: 804415 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用guava带来的方便

    博客分类:
  • java
阅读更多

    ​    ​guava是在原先google-collection 的基础上发展过来的,是一个比较优秀的外部开源包,最近项目中使用的比较多,列举一些点。刚刚接触就被guava吸引了。。。

    ​    ​这个是guava的一个官网ppt里面的介绍:

1
2
3
4
5
其实你可能发现,一些基本的校验完全可以自己写,但是。。
这些东西仅仅是看起来比较简单,实际上可能比我们想想的要复杂;
用一个公共的lib,别人可能更加容易理解你的代码;
当你用一个主流的开源包的时候,你可能在主流中;
当你发现一个可以提升的点的 时候,如果仅仅是修改自己的私有包,可能没有多少人能够受益;

 

1、非空检查,参数在赋值的时候就做一个检查

1
2
String inputName = "iamzhongyong";
String name = Preconditions.checkNotNull(inputName);

这个减少了代码行数,认为变量必须赋值才可以使用。

多条件校验

1
2
String inputName = "iamzhongyong";
Preconditions.checkArgument(inputName!=null && !"".equals(inputName),"input is null");

能够有效的减少代码行数

此外Preconditions中还有多个校验方法,可以优雅的进行判断了。

 

2、优雅的使用null

空指针异常是我们再写代码的时候经常遇到的,guava提供了Optional来让你不得不思考null的问题

Optional.of(T):获得一个Optional对象,其内部包含了一个非null的T数据类型实例,若T=null,则立刻报错。

Optional.absent():获得一个Optional对象,其内部包含了空值,内部代码看,是返回了Absent的一个实例。

Optional.fromNullable(T):将一个T的实例转换为Optional对象,T的实例可以不为空,也可以为空[Optional.fromNullable(null),和Optional.absent()等价。

1
2
3
4
Optional<String> name = Optional.of("iamzhongyong");
        if(name.isPresent()){
            System.out.println(name.get());
        }

 

3、Object中常用的方法

例如我们常见的equals方法和hashCode方法,Objects中都有与之对应的方法提供;

同时,toString是我们比较常用的,Objects.toStringHelper方法十分方便

1
2
3
4
5
6
7
8
public class StringHelp {
    public String name;
    public int age;
    @Override
    public String toString() {
        return Objects.toStringHelper(this).add("name"this.name).add("age"this.age).toString();
    }
}

 

4、字符转链接(Joiner 类)

1
2
3
4
5
6
7
8
public static void main(String[] args) {
        List<String> names = Lists.newArrayList();
        names.add("iamzhongyong");
        names.add("bixiao.zy");
        StringBuilder sb = new StringBuilder();
        String rs = Joiner.on("--").appendTo(sb, names).toString();
        System.out.println(rs);
    }

 

5、字符串分隔符

这个时候你可能说JDK自己有分割器,但是其实guava这个更加灵活,其实JDK的那个性能不咋滴

1
2
3
4
5
6
public static void main(String[] args) {
        String s = "dd  sfsfs  , dsfsf,ssfdfsdffsdfsf.sdfsfs,msfds";
        for(String name : Splitter.on(",").trimResults().split(s)){
            System.out.println(name);
        }
    }

 

6、不可变的集合(Immutable)

这里就拿一个map为例子,初始化一个集合,然后向里面放置几个不变的集合

1
2
3
Map<Integer,String> mapa = new HashMap<Integer,String>();
        mapa.put(122"iamzhongyong");
        mapa.put(1222"bixiao.zy");

现在用Immutable就可以很简单的完成了

1
2
ImmutableMap<Integer, String> map = ImmutableMap.of(122,"iamzhongyong",1222,"bixiao.zy");
        System.out.println(map.toString());

 

7、一个key对应多个Valve的情况

我们经常遇到这种,一个key有多个value的情况,一般的做法如下:Map<Key,List<Value>>的数据结构去搞,

但是现在又办法了,可以使用Multimap来解决这个问题,简洁明了

1
2
3
4
5
Multimap<Integer, String> keyValues = ArrayListMultimap.create();
        keyValues.put(1"a");
        keyValues.put(1"b");
        keyValues.put(2"c");
        System.out.println(keyValues.toString());

 

8、本地缓存

guava的缓存设计的比较巧妙,这里就简单介绍一下,guava的缓存创建分为两种,一种是CacheLoader的方式,一种是callback的方式

参数的话就不多介绍了,直接在CacheBuilder中可以看到,类似这个

1
2
3
4
5
CacheBuilder.newBuilder()
            .maximumSize(10)
            .initialCapacity(3)
            .expireAfterWrite(10, TimeUnit.SECONDS)
            .build();

下面这个例子是callback的形式

1
2
3
4
5
6
7
8
9
10
11
12
public void getNameFromLocalCache() throws Exception{
        //new一个cache的对象出来
        Cache<String/*name*/,String/*nick*/> cache = CacheBuilder.newBuilder().maximumSize(10).build();
        //在get的时候,如果缓存里面没有,则通过实现一个callback的方法去获取
        String name = cache.get("bixiao"new Callable<String>() {
            public String call() throws Exception {
                return "bixiao.zy"+"-"+"iamzhongyong";
            }
        });
        System.out.println(name);
        System.out.println(cache.toString());
    }

下面这个例子是LoadingCache的

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
public void getNameLoadingCache(String name) throws Exception{
        LoadingCache<String, String> cache = CacheBuilder.newBuilder()
            //设置大小,条目数
            .maximumSize(20)
            //设置失效时间,创建时间
            .expireAfterWrite(20, TimeUnit.SECONDS)
            //设置时效时间,最后一次被访问
            .expireAfterAccess(20, TimeUnit.HOURS)
            //移除缓存的监听器
            .removalListener(new RemovalListener<String, String>() {
                public void onRemoval(RemovalNotification<String, String> notification) {
                    System.out.println("有缓存数据被移除了");
                }})
            //缓存构建的回调
            .build(new CacheLoader<String, String>(){//加载缓存
                @Override
                public String load(String key) throws Exception {
                    return key + "-" "iamzhongyong";
                }
        });
 
        System.out.println(cache.get(name));
        cache.invalidateAll();
    }
    

 

9、集合 并集、交集、补集的方法

1
2
3
4
5
6
7
8
9
10
11
    HashSet setA = Sets.newHashSet(12345); 
    HashSet setB = Sets.newHashSet(45678); 
        
    SetView union = Sets.union(setA, setB); 
    System.out.println(union);
        
    SetView difference = Sets.difference(setA, setB); 
    System.out.println(difference);  
        
    SetView intersection = Sets.intersection(setA, setB); 
    System.out.println(intersection);

这些仅仅是一个开始

 

6
1
分享到:
评论
2 楼 cywhoyi 2013-11-27  
不知道你用过没有arraytable,非常好用,用它解决迷宫等复杂性的封装都很好
1 楼 terry21 2013-11-27  
有点意思,值得学习,我从github下载的一些国外开源项目也有用到。

相关推荐

    google开源项目guava.jar包

    谷歌的Guava库是Java开发中的一个非常重要的开源项目,它提供了一系列的高效、实用的工具类,大大简化了常见的编程任务。...在使用时,只需将此jar包添加到项目的类路径中,即可享受到Guava带来的便利。

    Guava常用类库 v33.0.0.zip

    6. **I/O工具**:Guava的Files、ByteStreams和CharStreams类提供了许多方便的静态方法,用于处理文件、字节流和字符流操作,简化了I/O操作。 7. **原生类型支持**:Guava提供了对基本类型(如int、char等)的泛型...

    guava-jdk5

    这个版本包含了Guava的核心特性,使得开发者在使用Java 5时也能享受到Guava带来的便利。 1. **集合框架扩展**:Guava对Java内置的集合框架进行了扩展和增强,提供了如Multiset(多频度集)、Multimap(多值映射)和...

    guava14.0.1jar包

    Guava是Google为Java平台设计的一个开源库,其版本号为14.0.1,主要目的是为了...需要注意的是,尽管Guava功能强大,但引入新的库也可能带来额外的学习成本和潜在的兼容性问题,因此在使用时应根据项目需求谨慎选择。

    guava-r07.zip

    Guava的IO库还支持异步I/O,使用ListenableFuture表示异步操作的结果,便于编写非阻塞代码。 总的来说,Guava库为Java开发者提供了一套强大且全面的工具集,极大地提升了开发效率和代码质量。无论是在大型企业级...

    guava-r09-jarjar.jar

    标题中的"guava-r09-jarjar.jar"是一个特定版本的Guava库,经过JarJar工具处理后的结果。...使用Guava时,需要注意其强大的功能可能带来的依赖管理和版本兼容性问题,确保与项目其他部分的协调一致。

    mahout的guava-r09-jar

    2. **缓存机制**:Guava的LoadingCache接口可以方便地创建自定义缓存策略,这对于频繁访问的数据,可以减少重复计算和提高响应速度。 3. **并发工具**:Guava提供了如CountDownLatch、CyclicBarrier等并发控制工具...

    google-guava.jar

    Guava的Files、CharStreams和ByteStreams等类,提供了更方便的文件读写和流操作。如Files.readAllBytes()可以一次性读取文件所有字节,避免了多次调用带来的性能损耗。 七、其他功能 除了上述主要功能,Guava还包括...

    Guava教程1使用GoogleCollections,G

    Guava早在Java 8的Stream API之前就引入了FluentIterable,它提供了类似Stream的功能,可以方便地对集合进行链式操作。例如: ```java FluentIterable&lt;String&gt; iterable = FluentIterable.from(Arrays.asList("a...

    guava-23.zip

    总的来说,Guava是一个强大的工具库,它通过提供丰富的实用类和接口,为Java开发带来了很多便利。正确地利用Guava,能够提升代码质量,提高开发效率。对于Java开发者来说,熟悉和掌握Guava是非常有价值的。

    开源架包guava

    开源架包Guava是Google为Java平台开发的一个广泛使用的库,其版本号为V19.0。Guava提供了一系列核心库,包括集合、缓存、并发工具、原生类型支持、字符串处理、I/O等,极大地丰富了Java标准库的功能。 首先,Guava...

    Getting Started with Google Guava

    《Getting Started with Google Guava》是一本面向初学者的指南,旨在帮助读者快速掌握Google Guava库的使用。Google Guava是Google推出的一个Java库,它包含了大量的实用工具类,可以极大地提高开发效率并简化代码...

    java基础 集合-26-Guava开源组件使用(4)

    同时,Guava支持函数式编程,例如Function接口用于表示一个输入到输出的映射,这在处理集合转换时非常方便。 6. **并发工具**:Guava包含了如Lists.newCopyOnWriteArrayList、Sets.newConcurrentHashSet等线程安全...

    Guava学习入门共51页.pdf.zip

    5. **原生类型支持**:Guava为基本类型提供了泛型安全的集合实现,如IntSet、LongList等,避免了自动装箱和拆箱带来的额外开销。 6. **字符串处理**:Guava的Strings类提供了一系列静态方法,如isEmpty()、...

    GuavaGoogle的Java核心库

    2. **缓存**:Guava提供了强一致性、弱引用、软引用等不同策略的本地缓存实现,能够方便地构建高效、自动管理的缓存系统。通过LoadingCache接口,开发者可以自定义缓存加载和过期策略,极大地优化了性能。 3. **...

    guava-demo:多个方便的番石榴功能演示

    Guava 的 `Strings` 类提供了多种字符串操作方法,如 `join()`、`commonPrefix()` 和 `abbreviate()`,方便我们进行字符串连接、查找公共前缀和截断显示。 7. **流(Stream)** 虽然 Java 8 引入了 Stream API,...

    guava,google项目名称、集合、缓存、原语支持、并发库、公共注释、字符串处理、i/o。美国石油学会.zip

    这个项目的名称“Guava”来源于番石榴,象征着它为Java带来了一种新鲜、多彩的元素。Guava的核心特性包括但不限于集合框架的增强、缓存机制、原语操作的支持、并发编程工具、公共注解以及字符串处理和I/O操作的优化...

    Guava:使用 Google Guava 框架

    Guava 支持原始类型的泛型,减少了装箱和拆箱带来的性能损失。例如,它提供了 Int2IntMap、LongFunction 等原始类型接口,使得处理大量数值时性能得到显著提升。 **5. 字符串处理** Guava 提供了非常强大的字符串...

    Google+Guava+官方教程+-+v1.1.rar

    Guava对基本类型如int、long等提供了泛型安全的包装类,避免了自动装箱拆箱带来的性能损失。此外,它还提供了Pair、Triple等简单的数据结构,方便处理双值或三值的数据。 五、字符串处理 Guava的Strings类包含大量...

Global site tag (gtag.js) - Google Analytics