文档章节

guava vs jdk8

Crazy_Coder
 Crazy_Coder
发布于 2017/05/23 16:14
字数 1160
阅读 172
收藏 4

#Guava Guava是Google公司开源的一个实用工具库,对Java类库进行了多方面的增强。比如说,对函数式编程的支持,新的集合类(Multimap等),Cache支持,等等。在Java8之前,Guava和Java之间的关系,可以表示成下面这幅图: 但是随着Java8的发布,Guava和Java的关系发生了一些改变。Guava提供的很多功能,被内置在了Java8里,如下图所示:

源码: Github Google Code API: API Users' Guide:Users' Guide

  1. Joiner用来拼接n个字符串,下面是一个例子:

    • 使用guava
    public static String useGuava(List strList) {
        return Joiner.on(",").skipNulls().join(strList);
    }
    
    • 使用jdk8
    public static String useJdk8(List strList) {
        //lambda表达式
        return strList.stream().filter(m -> m != null).collect(Collectors.joining(","));
    }
    
    • 使用jdk7以及jdk7之前的版本
    public static String useJdk7(List strList) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < strList.size(); i++) {
            sb.append(strList.get(i));
            if (i + 1 != strList.size()) {
                sb.append(",");
            }
        }
        return sb.toString();
    }
    
  2. Guava提供了Ordering类以方便我们创建Comparator

    • 使用guava
    public static List useGuava(List players) {
        Ordering ordering = Ordering.natural().nullsFirst().onResultOf(new Function() {
            @Override
            public Integer apply(Player foo) {
                return foo.getOrder();
            }
        });
    
        return ordering.sortedCopy(players);
    }
    
    • 使用jdk8
    public static List useJdk8(List players) {
        Comparator cmp = Comparator.comparing(Player::getOrder, Comparator.nullsFirst(Comparator.naturalOrder()));
    
        players.sort(cmp);
        return players;
    }
    
    • 使用jdk7以及jdk7之前的版本
    public static List useJdk7(List players) {
        players.sort(new Comparator() {
            @Override
            public int compare(Player o1, Player o2) {
                Integer order1 = o1.getOrder();
                Integer order2 = o2.getOrder();
    
                if (order1 > order2) {
                    return 1;
                } else if (order1 == order2) {
                    return 0;
                } else {
                    return -1;
                }
            }
        });
    
        return players;
    }
    
  3. 对null的处理

    • guava中对null的处理Optional

      • null是模棱两可的,会引起令人困惑的错误,有些时候它让人很不舒服。很多Guava工具类用快速失败拒绝null值,而不是盲目地接受。
      • Optional是一个abstract类,两个实现类PresentAbsent
        • Present: Implementation of an Optional containing a reference.
        • Absent: Implementation of an Optional not containing a reference.

      eg:

      // 创建一个非空对象,类型为integer
      Optional possible = Optional.of(6);
      // Returns true if this holder contains a (non-null) instance.
      System.out.println("possible isPresent: " + possible.isPresent());
      System.out.println("possible value: " + possible.get());
      
      // 创建一个空对象
      Optional absentOpt = Optional.absent();
      // 取值,会报错
      System.out.println("absentOpt value: " + absentOpt.get());
      
      // If nullableReference is non-null, returns an Optional instance containing that reference; otherwise returns Optional.absent.
      // fromNullable表示如果创建一个非空对象,则返回Present
      Optional<Integer> NoNullableOpt  = Optional.fromNullable(10);
      // 创建空对象,则返回Absent
      Optional<Integer> NullableOpt = Optional.fromNullable(null);
      

      其他详细请查阅API - Guava Optional API

    • Guava使用Preconditions对null的预先判断

      • 类似我们使用StringUtils等工具类
      • 但是不同的是,StringUtils等工具类是判断是否为空并得到结果,而Guava是使用判断的结果,如果为空,则直接抛异常。 eg.
      // givenName是传入的参数
      String name = Preconditions.checkNotNull(givenName);
      // com.google.common.base.Preconditions.checkNotNull方法重载了三次
      public static <T> T checkNotNull(T reference)  
      public static <T> T checkNotNull(T reference, Object errorMessage)  
      public static <T> T checkNotNull(T reference, String errorMessageTemplate, Object... errorMessageArgs) 
      
      // 而jdk8中的java.util.Objects也提供了三个类似的方法
      public static <T> T requireNonNull(T obj) // @since 1.7
      public static <T> T requireNonNull(T obj, String message) // @since 1.7
      public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier) // @since 1.8
      
    • jdk8对null的处理 jdk8新加入类java.util.Optional,使用方法与Guava相似。关于jdk8中的Optional可参考迟到的Optional。Optional 被定义为一个简单的容器,其值可能是null或者不是null。在Java 8之前一般某个函数应该返回非空对象但是偶尔却可能返回了null,而在Java 8中,不推荐你返回null而是返回Optional。 eg.

    // 不直接返回需要的类型String,而是返回Optional包含的String
    Optional<String> optional = Optional.of("bam");
    //  true if there is a value present, otherwise false
    optional.isPresent();           // true
    //  取值,如果为空,则抛出异常NoSuchElementException
    optional.get();                 // "bam"
    // 如果为空则返回传入的值,否则返回其值
    optional.orElse("fallback");    // "bam"
    // 结合lambda表达式
    optional.ifPresent((s) -> System.out.println(s.charAt(0)));     // "b"
    

    其他详细请查阅API - JDK8 Optional API

  4. 对于集合的处理

    • 创建集合
      • 普通做法 eg.

        List<Player> players = new ArrayList<Player>();
        players.add(new Player("bowen",20)); 
        players.add(new Player("bob", 20)); 
        players.add(new Player("Katy", 18)); 
        players.add(new Player("Logon", 24));
        
      • 在Guava中: eg.

        List<Player>  players = Lists.newArrayList(new Player("bowen", 20), new Player("bob", 20), new Player("Katy", 18), new Player("Logon", 24));
        
      • Java中: eg.

        List<Player> players = new ArrayList<Player>() { {
            add(new Player("bowen", 20));
            add(new Player("bob", 20));
            add(new Player("Katy", 18));
            add(new Player("Logon", 24));
        

}}; - 操作集合 要求:按年龄将上述人员分组 - 通常的做法(jdk8之前的版本)java public void mapListJava7(List<Player> players) { Map<Integer, List<Player>> groups = new HashMap<>(); for (Player player : players) { List<Player> group = groups.get(player.getAge()); if (group == null) { group = new ArrayList<>(); groups.put(player.getAge(), group); } group.add(player); } } - 在guava中,提供了`Multimap `java public void guavaMultimap(List<Player> players) {
Multimap<Integer, Player> groups = ArrayListMultimap.create();
for (Player player : players) {
groups.put(player.getAge(), player);
}
} - 在jdk8中,给Map添加了一个新的方法`getOrDefault()`,即使不用lambda表达式,代码也清洁许多:java // 非lambda public void mapListJava8(List<Player> players) {
Map<Integer, List<Player>> groups = new HashMap<>();
for (Player player : players) {
List<Player> group = groups.getOrDefault(player.getAge(), new ArrayList<>());
group.add(player); groups.put(player.getAge(), group); }
}

    // 使用lambda表达式
    public void groupingByJava8(List<Player> players) {  
        Map<Integer, List<Player>> groups = players.stream().collect(Collectors.groupingBy(Player::getAge));  
    }  
    ```

© 著作权归作者所有

共有 人打赏支持
上一篇: 博客搭建过程
下一篇: 函数式编程介绍
Crazy_Coder

Crazy_Coder

粉丝 143
博文 23
码字总数 22794
作品 5
南京
程序员
私信 提问
走近Guava(二): 函数式编程

函数式编程: 使用Function接口(jdk8中已经存在): /** 其功能就是将输入类型转换为输出类型 /public interface Function<F, T> {T apply(@Nullable F input);} 比如一个简单的日期转换: /*...

ihaolin
2014/04/01
0
0
Guava 2:Basic utilities基本工具

一、引子 Guava的经典很大一部分原因来源于对于基础工具类的封装,使用这些类能够让我们的代码更加优雅且完善,这些类大部分都在com.google.common.base包下。 注:JDK有很多借鉴guava的地方...

只会一点java
07/25
0
0
Weld 2.4.0 首个RC版发布,Java 依赖注入框架

Weld 2.4.0 首个 RC 版发布了,主要改进记录如下: Bug [WELD-2093] - Invocation of a JDK8 default method should be intercepted [WELD-2174] - Weld api don't include the license fil......

局长
2016/08/22
934
2
Jackson 2.6.2 发布,高性能 JSON 处理

Jackson 是一个 Java 用来处理 JSON 格式数据的类库,性能非常好。 Jackson Core 2.6.2 发布,此版本更新内容如下: #213: Parser is sometimes wrong when using CANONICALIZE_FIELD_NAMES ...

淡漠悠然
2015/09/16
1K
4
fastjson 1.2.24 发布,Java 的 JSON 处理器

fastjson 1.2.24 发布了。主要更新内容如下: Issues: JDK8 ZonedDateTime反序列化报错的 #980 新增加retrofit2内置支持 #956 https://github.com/alibaba/fastjson/wiki/Retrofit2Support......

wenshao
2017/01/19
2.4K
17

没有更多内容

加载失败,请刷新页面

加载更多

Git工作原理

git跟传统的代码管理器(如svn)不同, 主要区别在于git多了个本地仓库以及缓存区,所以即使无法联网也一样能提交代码。 术语解释: 工作区间: 即我们创建的工程文件, 在编辑器可直观显示;...

Lienson
4分钟前
0
0
MySQL驱动对应Server版本、JDK版本

昨日生产上线,临时升级MySQL版本,导致连接不上。 应用JDK版本1.5 测试环境MySQL版本5.7 驱动版本5.1.40.jar 正常 生产环境MySQL版本8.0 驱动版本5.1.40.jar 连接不上 生产环境MySQL版本8.0...

zcjlq
6分钟前
1
0
千万级规模【高性能、高并发】互联网架构经验分羹

架构以及我理解中架构的本质 在开始谈我对架构本质的理解之前,先谈谈对今天技术沙龙主题的个人见解,千万级规模的网站感觉数量级是非常大的,对这个数量级我们战略上 要重 视 它 , 战术上又...

java知识分子
6分钟前
0
0
重磅!阿里巴巴工程师获得 containerd 社区席位,与社区共建云时代容器标准

重磅!阿里巴巴工程师获得 containerd 社区席位,与社区共建云时代容器标准 11 月 29 日,CNCF containerd 社区正式宣布:两位阿里巴巴工程师正式获得 containerd 社区席位,成为 containerd...

阿里云官方博客
8分钟前
0
0
你会用哪些JavaScript循环遍历

总结JavaScript中的循环遍历 定义一个数组和对象 const arr = ['a', 'b', 'c', 'd', 'e', 'f'];const obj = { a: 1, b: 2, c: 3, d: 4} for() 经常用来遍历数组元素 遍历值为数组...

peakedness丶
9分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部