文档章节

guava vs jdk8

Crazy_Coder
 Crazy_Coder
发布于 2017/05/23 16:14
字数 1160
阅读 51
收藏 3
点赞 0
评论 0

#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

粉丝 142
博文 20
码字总数 22794
作品 5
南京
程序员
走近Guava(二): 函数式编程

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

ihaolin ⋅ 2014/04/01 ⋅ 0

Guava 24.1.1 发布,Google 的 Java 核心工具库

Guava 24.1.1 发布,此次更新修复了使用 Guava 和反序列化攻击者数据的服务器的 DOS 漏洞:CVE-2018-10237。 Maven com.google.guava guava 24.1.1-jre 24.1.1-android...

雨田桑 ⋅ 04/29 ⋅ 0

Guava 23.5 版本发布,Google 的 Java 核心库

Guava 23.5 已发布,Guava 是 Google 的一个开源项目,包含许多 Google 核心的 Java 常用库,如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [con...

局长 ⋅ 2017/11/24 ⋅ 7

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 ⋅ 2

好久不见,SpringSide 归来,有性能的基础库

一入侯门深似海,大家两年不见了。 1. 开场白 这次复活的是SpringSide-Utils模块,把在唯品会两年的实践抽取出来,做一个大大大的公共类库。一边封装 Guava 和 Apache Common Lang,一边参考...

江南白衣 ⋅ 2017/01/16 ⋅ 81

Guava 23.3 版本发布,Google 的 Java 核心库

Guava 23.3 已发布,Guava 是 Google 的一个开源项目,包含许多 Google 核心的 Java 常用库,如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [con...

王练 ⋅ 2017/10/27 ⋅ 4

Jackson 2.6.2 发布,高性能 JSON 处理

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

淡漠悠然 ⋅ 2015/09/16 ⋅ 4

Guava 23.4 版本发布,Google 的 Java 核心库

Guava 23.4 已发布,Guava 是 Google 的一个开源项目,包含许多 Google 核心的 Java 常用库,如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [con...

周其 ⋅ 2017/11/10 ⋅ 3

Guava 25.1 发布,Google 的 Java 核心工具库

Guava 25.1 已发布,更新如下: Switched to the type annotation version of in the JRE/Java 8 flavor. : Added , copied from . : Added Token Binding HTTP headers to . : Added overr......

王练 ⋅ 05/24 ⋅ 0

走近Guava(四): 并发

并发: Guava集合处理是很强大的(这些在jdk8中都有些引入),但Guava发光的地方是并发。 Monitor Monitor实现同步 /** 通过Monitor的Guard进行条件阻塞 */public class MonitorSample {privat...

ihaolin ⋅ 2014/04/05 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Hive函数

1.函数explode (一转多) create table hive_wc(sentence string); load data local inpath '/home/hadoop/data/hive-wc.txt' into table hive_wc; 结果: hive > select * from hive_wc; ......

GordonNemo ⋅ 25分钟前 ⋅ 0

PE格式第三讲扩展,VA,RVA,FA的概念

作者:IBinary 出处:http://www.cnblogs.com/iBinary/ 版权所有,欢迎保留原文链接进行转载:) 一丶VA概念 VA (virtual Address) 虚拟地址的意思 ,比如随便打开一个PE,找下它的虚拟地址 这边...

simpower ⋅ 43分钟前 ⋅ 0

使用Java connector消费ABAP系统的函数

Java Connector(JCO)环境的搭建:Step by step to download and configure JCO in your laptop 我的ABAP系统有个函数名叫ZDIS_GET_UPSELL_MATERIALS,输入一个customer ID和product ID,会输......

JerryWang_SAP ⋅ 48分钟前 ⋅ 0

IDEA提示编码速度

焦点移动 将焦点冲代码编辑窗口移动到菜单栏:Alt+菜单栏带下划线字母 将焦点从工具窗口移动到代码编辑窗口 Esc或Shift+Esc 将焦点从代码编辑移动到最近使用的工具窗口 F12 模板提示 Ctrl+J...

bithup ⋅ 今天 ⋅ 0

180623-SpringBoot之logback配置文件

SpringBoot配置logback 项目的日志配置属于比较常见的case了,之前接触和使用的都是Spring结合xml的方式,引入几个依赖,然后写个 logback.xml 配置文件即可,那么在SpringBoot中可以怎么做?...

小灰灰Blog ⋅ 今天 ⋅ 0

冒泡排序

原理:比较两个相邻的元素,将值大的元素交换至右端。 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第...

人觉非常君 ⋅ 今天 ⋅ 0

Vagrant setup

安装软件 brew cask install virtualboxbrew cask install vagrant 创建project mkdir -p mst/vmcd mst/vmvagrant init hashicorp/precise64vagrant up hashicorp/precise64是一个box......

遥借东风 ⋅ 今天 ⋅ 0

python3.6 安装pyhook_3

我的是在win下的,忙了半天老是安装不了, pip install 也不行。 那么可以看出自己的版本是32bit 一脸懵逼 没办法 只好下载32版本的来安装 我一直以为 是 对应32 位的 。 下面是 小例子 http...

之渊 ⋅ 今天 ⋅ 0

004、location正则表达式

1、location的作用 location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。 2、location的语法 = 开头表示精确匹配 ^~...

北岩 ⋅ 今天 ⋅ 0

CentOS7 静默安装 Oracle 12c

环境 CentOS7.5 最小安装 数据库软件 linuxx64_12201_database.zip 操作系统配置 关闭 SELinux sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config 关闭防火墙 systemctl disable ......

Colben ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部