Google Guava库必需品

我希望代码简单,短而又易于阅读。 不必要的复杂性分散了人们对真实情况的理解,使他们难以理解,并且可能成为生产力的真正杀手。

您知道,缠结的for循环和索引可以跟踪是否/其他情况和切换用例,空/验证检查,转换/复制/删除/排序集合,异常处理……列表随着行号和维护负担的增加而继续存在。

我想到了托尼·霍尔的一句名言。

构建软件设计的方法有两种:一种方法是使它变得如此简单,以至于显然没有缺陷,另一种方法是使它变得如此复杂以至于没有明显的缺陷。

换句话说:细节中有魔鬼。

Apache Commons具有补充JDK API的一些最出色的库,但本文与Commons无关。 它是关于Google Guava的 ,在很多方面都与Commons类似。 它为常用的日常任务提供了一个库,例如集合处理,字符串处理,并发,IO,基元,异常等。

Guava中有很多很棒的东西,我没有时间去浏览完整的库,但是这里至少有一些它可以做什么的例子。

对象
使用对象可以轻松地实现哈希码/等式,而不会使您的类过于混乱(对我而言,Eclipse自动生成往往有些冗长)。

实现toString的类在进行调试和日志记录时非常令人愉悦,但是确实是一个痛苦的实现。 Objects.toStringHelper使得此操作非常容易,并且还有助于维护打印对象的一致格式。

public class Item {private String id;private String name;public Item(String id, String name) {this.id = id;this.id = name;}public String getId() {return id;}public String getName() {return name;}@Overridepublic int hashCode() {return Objects.hashCode(getId(), getName());}@Overridepublic String toString() {return Objects.toStringHelper(this).add("id", getId()).add("name", getName()).toString();}@Overridepublic boolean equals(Object o) {if (!(o instanceof Item)) {return false;}Item other = (Item) o;return Objects.equal(getId(), other.getId()) && Objects.equal(getName(), other.getName());}
}

打印此类会输出类似这样的内容。

Item{id=1, name=Book}

可抛物
包装原始异常对象并不总是合适的,因为如果不相关的类加载器之间发生通信,或者在网络上对其进行序列化,则可能导致客户端代码中的ClassNotFoundException。 Throwables可以解除这种依赖关系,仍然允许远程客户端通过将其转换为字符串来查看堆栈跟踪。

try {// throws implementation specific exception
} catch (InternalException e) {throw new ApiException("reason", Throwables.getStackTraceAsString(e));
}

可迭代
连接两个单独的集合并对结果执行操作可能会导致很多混乱。 遍地抢救。 花一点时间,思考一下如果没有Iterables.concat,代码的外观如何。

for (Item item : Iterables.concat(books, electronics)) {// do something useful
}

多图
Multimap就像一个Map,但是允许为每个键存储多个值。 以下示例是类型安全的异构容器的变体,该容器使用multimap来实现商品的产品目录。

public class ProductCatalogue {private Multimap<Class,? extends Item>, Item> catalogue = ArrayListMultimap.create();public void add(Item item) {catalogue.put(item.getClass(), item);}public <T extends Item> Collection<Item> list(Class<T> clazz) {return catalogue.get(clazz);}
}ProductCatalogue catalogue = new ProductCatalogue();
catalogue.add(new Book("1", "Book1"));
catalogue.add(new Movie("2", "Movie1"));
// only get books
System.out.println("Books " + catalogue.list(Book.class));
// only get movies
System.out.println("Movies " + catalogue.list(Movie.class));

双图
BiMap在Map的键和值之间实现了一对一的双向关系。 这是一个使用语言代码获取语言的示例,反之亦然。

BiMap<String, String> languageCodes = HashBiMap.create();
languageCodes.put("en", "English");
languageCodes.put("fr", "French");
languageCodes.put("zh", "Chinese");
assert "English" == languageCodes.get("en");
assert "en" == languageCodes.inverse().get("English");

前提条件
大多数类在构造函数和方法中给定的值都有限制。 无效值应通过在执行前进行显式有效性检查来尽快升级。 快速故障要比以后由于意外的异常而失败,或更糟糕的是,静默地计算错误的结果要好得多。

public Item(String id, String name) {this.id = Preconditions.checkNotNull(id, "id must not be null");this.name = Preconditions.checkNotNull(name, "name must not be null");Preconditions.checkArgument(name.length() > 6, "name must be longer than 6 chars");
}

约束条件
约束与先决条件类似,它们可以限制将哪些值添加到集合中。 由于约束与业务代码分离,因此这使集合的使用更加容易并且代码更加简洁。

public class Voyage {private Country targetcountry;private int capacity;private List<Cargo> items = Constraints.constrainedList(new ArrayList<Cargo>(), new Constraint<Cargo>() {@Overridepublic Cargo checkElement(Cargo cargo) {Preconditions.checkNotNull(cargo);Preconditions.checkArgument(targetcountry.allows(cargo));Preconditions.checkArgument(cargo.getUnits() gt; 0);return cargo;}});public void load(List<Cargo> cargos) {items.addAll(cargos);}
}

谓词和功能
谓词评估是真还是假,但也可以使用“与”,“或”,“非”和“中”组合成更复杂的评估。

现在通常需要for循环和一堆if语句的内容现在可以简化为单行代码。 那有多甜?

Predicate<Item> heavyItemPolicy = new Predicate<Item>() {@Overridepublic boolean apply(Item item) {if(item.getWeight() > 1000){return true;}return false;}
};
Collection<Item> heavyItems = Collections2.filter(order, heavyItemPolicy);

您也可以类似的方式使用Maps.filterKeys或Iterables.filter。 但是请记住,从修改中删除是双向的。 例如从原点移除会影响结果,反之亦然。

另一方面,函数是一种将一个对象转换为另一个对象的方法。 例如,按项目顺序转换并发。

Function currencyConverter = new Function<Double, Item>() {@Overridepublic Double apply(Item item) {return item.getPrice() * ANOTHER_CURRENCY;}
}
Collection<Double> prices = Collections2.transform(order, currencyConverter);

您也可以类似的方式使用Maps.transformValues或Iterables.transform。

查询API
一段时间以来,我一直在考虑如何创建简单但功能强大的Fake Objects 。 但是我不希望假冒产品本身成为维护负担,因此它们必须易于实施。 我的直觉告诉我,我需要一个通用的状态管理框架来使其正常工作。 因此,我使用谓词创建了一个小的流利查询接口,该接口与内存中的存储进行交互。

InMemoryStorage storage = new InMemoryStorage();
// add a few Item.class objects to storage
Criteria middleprice = field("price").is(largerThan(100)).and(lessThan(200));
Criteria expired = field("expires").is(after(currentDate));
Collection<Item> result = storage.select(middleprice.and(not(expired))).from(Item.class);

实际上,我对结果感到非常满意-简短,紧凑,易于理解和类型安全。

我在这里不做详细介绍,但是请检查Criteria和InMemoryStorage的实现以及测试 。

我希望这些示例将触发您进一步研究 Guava,并使用它使您的代码更具可读性,鲁棒性和可维护性。

最后,我确实希望这些功能中的许多功能能够在不久的将来达到标准Java。

参考: Deep Hacks博客上 的详细信息来自我们的JCG合作伙伴 KristofferSjögren

相关文章 :

  • Java Lambda语法替代
  • Java中的低GC:使用原语而不是包装器
  • Java泛型快速教程
  • Java最佳实践教程系列

翻译自: https://www.javacodegeeks.com/2011/09/google-guava-libraries-essentials.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374746.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单调栈3_水到极致的题 HDOJ4252

A Famous City 题目大意 给出正视图 每一列为楼的高度 最少有几座楼 坑点 楼高度可以为0 代表没有楼 贡献了两发RE 原因 if(!s.empty()&&tem){s.push(tem); continue;}并不能筛去 空栈且 tem为0的情况 改为 if(!s.empty()){if(tem) s.push(tem); continue;} 后AC 题目…

eclipse配置远程调试

一、配置 1、cd apache-tomcat/bin 2、vi startup.sh文件 3、在文件开头处&#xff0c;添加下方代码(address代表的是调试端口) declare -x CATALINA_OPTS"-Xdebug -Xnoagent -Djava.compilerNONE -Xrunjdwp:servery,transportdt_socket,suspendn,address…

力扣两数之和 II - 输入有序数组

题目:给定一个已按照 非递减顺序排列 的整数数组 numbers &#xff0c;请你从数组中找出两个数满足相加之和等于目标数 target 。 我的代码&#xff1a; 对撞指针 class Solution {public int[] twoSum(int[] numbers, int target) {int low 0;//指向头int high numbers.le…

SpringMVC 3 Tiles 2.2.2集成教程

Apache Tiles是基于Java的Web应用程序的流行且最常用的模板框架。 由于Struts 1.x使用Tiles作为其默认模板框架&#xff0c;因此Tiles变得更加流行。 SpringMVC是一个MVC框架&#xff0c;例如Struts &#xff0c;也支持将Tiles集成为其模板框架。 让我们看看如何集成SpringMVC和…

[团队项目3.0]Scrum团队成立

Scrum团队成立 5.Scrum团队成立 5.1 团队名称&#xff0c;团队目标、团队口号、团队照&#xff1b; 5.2 角色分配 产品负责人: 决定开发内容和优先级排序&#xff0c;最大化产品以及开发团队工作的价值。 Scrum Master&#xff1a; 负责确保团队遵循 Scrum 的理论、实践和规则。…

Base64编码的java实现

Java本身是提供了Base64编码的工具包的&#xff0c;做项目的时候自己实现了个&#xff0c;在这里记录一下&#xff1a; 1 /** Base64编码数组 */2 private static final String base64EncodeChars "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456…

Character.isLetterOrDigit(ch)判断ch是否为字母或数字

Character.isLetter(ch) 判断ch是否为字母 Character.isDigit(ch) 判断ch是否为数字 Character.isLetterOrDigit(ch) 判断ch是否为字母或数字 /* 例子*/char ch q;System.out.println(Character.isLetter(ch));System.out.println(Character.isDigit(ch));System.out.print…

高级SmartGWT教程,第1部分

贾斯汀&#xff08;Justin&#xff09;&#xff0c;帕特&#xff08;Pat&#xff09;和我已经开始着手一个需要用户界面进行管理和管理的副项目。 在与SmartGWT和GWT共同工作了一段时间之后&#xff0c;我们决定使用SmartGWT创建接口。 我们非常喜欢视觉组件&#xff08;请查看…

git 技巧

将某个文件回退到某个版本 git co d359624286d9c1f022b8b3b6f2d3fe3b6524188b build.sh 查看某个文件在某个版本时的内容 git show d359624286d9c1f022b8b3b6f2d3fe3b6524188b:build.sh 如果想把这个文件重命名保存 git show d359624286d9c1f022b8b3b6f2d3fe3b6524188b:build.s…

机会

民生电商的机会.地点在成都. 联系 &#xff1a;iskall0 at 163.com 待遇 &#xff1a;和BAT差不多. H5方向&#xff1a; 前端功底扎实.对H5有较深的理解和造诣.大数据方向1&#xff1a; SSH玩的熟.linux玩的熟.熟悉云计算架构和SOA.MySQL玩的熟,PostgreSQL加分 : ]熟Hadoop、St…

力扣验证回文串

给定一个字符串&#xff0c;验证它是否是回文串&#xff0c;只考虑字母和数字字符&#xff0c;可以忽略字母的大小写 代码思路&#xff1a;将s中的每个字符用for循环取出&#xff0c;判断一下&#xff0c;如果是字母或者数字&#xff0c;插入到StringBuffer类型sgood中&#xf…

Spring MVC3 Hibernate CRUD示例应用程序

学习从HelloWorld应用程序开始的任何Web框架都是一个好主意。 一旦我们熟悉了框架配置&#xff0c;最好做一个CRUD&#xff08;创建&#xff0c;读取&#xff0c;更新&#xff0c;删除&#xff09;应用程序&#xff0c;该应用程序涵盖Web框架的各个方面&#xff0c;例如验证&am…

Linux Mint---ATI显卡驱动安装篇

显卡驱动可谓是至关重要&#xff0c;当时折腾debian驱动的时候可是弄了好几天才搞定的&#xff0c;现在却非常容易就是装上&#xff0c; 详见这篇博客&#xff1a;http://www.yyearth.com/article/14-03/amd13.html 在此表示感谢&#xff01; 我的話&#xff0c;全在圖形界面下…

百度云推送的简单集成

1.在百度云推送的应用管理页面&#xff0c;创建自己的应用&#xff0c;创建应用时&#xff0c;需要提供两个证书&#xff0c;开发环境的推送证书和正式环境的推送证书。证书的格式是pem格式的&#xff0c;需要先在apple 开发者中心配置好推送证书&#xff0c;安装到mac上&#…

高级SmartGWT教程,第2部分

这是我的教程的第二部分&#xff0c;有关使用SmartGWT快速进行UI开发。 在本教程的第一部分中 &#xff0c;我们创建了基本的界面布局并添加了一些基本组件。 现在是时候解决这个问题&#xff0c;并使用SmartGWT的真正功能了。 在继续之前&#xff0c;让我们记住到目前为止我们…

有感而发,生活

我们每一个人都是独一无二的&#xff0c;当然我们每一个人的路子也是不尽相同的&#xff0c;不能因为一时的失意而放弃了自己儿时的梦想&#xff0c;路是一步一步走的&#xff0c;未来需要努力&#xff0c;我相信 我们每一个人都可以做到自己心中的样子&#xff0c;安逸的生活是…

力扣反转字符串中的元音字母

给你一个字符串 s &#xff0c;仅反转字符串中的所有元音字母&#xff0c;并返回结果字符串。 元音字母包括 ‘a’、‘e’、‘i’、‘o’、‘u’&#xff0c;且可能以大小写两种形式出现。 代码思路&#xff1a; 1.将字符串转换为字符数组 2.设置碰撞指针&#xff0c;从两头寻…

使用 SqlDataSource 插入、更新和删除数据49

简介 正如在 数据插入、更新和删除概述 中讨论的那样&#xff0c;GridView 控件提供内置的更新和删除功能&#xff0c;而DetailsView 和 FormView 控件则包含对插入、编辑和删除功能的支持。这些数据修改功能无需编写任何代码&#xff0c;可直接嵌入数据源控件。 数据插入、更新…

Solaris是出色的Java开发平台的原因

几天前&#xff0c;我发布了“ OpenSolaris的死亡&#xff1a;为Java开发人员选择操作系统 ”&#xff0c;其中我说Solaris是Java开发人员的绝佳平台。 这篇文章的重点只是想知道自OpenSolaris淘汰以来我将使用哪个Solaris版本。 正如Neil的评论使我意识到的那样&#xff0c;该…

python , angular js 学习记录【2】

1.不同scope之间的通信 &#xff08;1&#xff09;无父子关系的scope通信&#xff1a; 在需要操作的scope里面定义一个事件&#xff0c;名称为delete_host&#xff0c;参数为data $rootScope.$on(delete_host, function(event,data) {angular.forEach($scope.hosts, function (…