Guava分享-刘要华

合集下载

guava 实现原理

guava 实现原理

guava 实现原理Guava是一个流行的Java编程库,它提供了许多实用的工具类和函数,可以帮助开发人员更轻松地完成日常开发任务。

在本文中,我们将探讨Guava的实现原理,包括其核心组件、常用功能以及如何使用Guava来提高代码质量和性能。

Guava的核心组件包括:1. 基本工具类:包括基本数据类型和字符串的工具类、集合类和函数式编程工具类等。

2. 缓存:提供了缓存的实现,可用于缓存通过网络或其他资源获取的数据。

3. 集合:提供了更简单、更强大的集合类,如不可变集合、多重集合、集合工具类等。

4. 并发:提供了更便捷的并发编程工具类,如线程池、future 模式、原子变量等。

5. 字符串:提供了更强大、更易用的字符串处理工具类,如Splitter、CharMatcher、CaseFormat等。

其中,Guava的集合类是其最重要的组件之一。

在Guava中,集合被分类为两种类型:可变集合和不可变集合。

不可变集合是线程安全的,可以在多个线程中共享。

可变集合是非线程安全的,但提供了更高效的操作方法。

Guava的常用功能包括:1. 字符串处理:Guava提供了一些强大的字符串处理工具类,如Splitter、Joiner、CharMatcher、CaseFormat等,可以帮助开发人员更轻松地处理字符串。

2. 集合处理:Guava提供了一些强大的集合处理工具类,如Iterables、Lists、Maps等,可以帮助开发人员更轻松地操作集合。

3. 缓存管理:Guava提供了一些强大的缓存管理工具类,如LoadingCache、CacheBuilder等,可以帮助开发人员更轻松地管理缓存。

4. 并发编程:Guava提供了一些强大的并发编程工具类,如ListenableFuture、Futures、RateLimiter等,可以帮助开发人员更轻松地实现并发编程。

最后,使用Guava来提高代码质量和性能需要注意以下几点:1. 尽量使用不可变集合,可以避免线程安全问题。

java中triple用法(二)

java中triple用法(二)

java中triple用法(二)Java中Triple用法Triple是Java中的一个类,它是在Jena框架中定义的,用于表示一个由三个元素组成的元组。

Triple的三个元素分别代表主语(subject)、谓语(predicate)和宾语(object)。

在本文中,我们将介绍Triple的几种常见用法。

1. 创建Triple对象要创建一个Triple对象,需要使用Triple类的构造函数,并将主语、谓语和宾语作为参数传递给构造函数。

例如:Node subject = ("Alice");Node predicate = ("Node object = ("Smith");Triple triple = new Triple(subject, predicate, object);在上面的示例中,我们使用了NodeFactory类创建了主语、谓语和宾语的节点,并将它们作为参数传递给Triple的构造函数,从而创建了一个Triple对象。

2. 获取Triple的主语、谓语和宾语Triple类提供了获取主语、谓语和宾语的方法。

您可以使用getSubject()、getPredicate()和getObject()方法来获取Triple对象的三个元素。

例如:Node subject = ();Node predicate = ();Node object = ();在上面的示例中,我们分别获取了Triple对象的主语、谓语和宾语,并将它们分别赋值给了subject、predicate和object变量。

3. 比较两个Triple对象您可以使用Triple类的equals()方法来比较两个Triple对象是否相等。

equals()方法会比较两个Triple对象的主语、谓语和宾语是否完全相同。

例如:Triple triple1 = new Triple(subject1, predicate1, o bject1);Triple triple2 = new Triple(subject2, predicate2, object 2);boolean isEqual = (triple2);在上面的示例中,我们创建了两个Triple对象triple1和triple2,并使用equals()方法比较它们是否相等。

Java8-Guava实战示例

Java8-Guava实战示例

Java8-Guava实战⽰例⽰例⼀:跟⽰例三对⽐⼀下,尽量⽤⽰例三List<InvoiceQueryBean> invoiceQueryBeanList = new ArrayList<>();List<String> invoices = Lists.newArrayList(Iterators.transform(invoiceQueryBeanList.iterator(), new Function<InvoiceQueryBean, String>() {@Nullable@Overridepublic String apply(@Nullable InvoiceQueryBean input) {if (StringUtils.isNotBlank(input.getLoanInvoiceId())) {return input.getLoanInvoiceId();} else {return null;}}}));//去除空的Iterators.removeIf(invoices.iterator(), StringUtils::isBlank);⽰例⼆:public static List<PersonLoanInvoiceQueryPojo> getInvoiceQueryPojoList(List<InvoiceQueryBean> invoiceQueryBean) { return Lists.newArrayList(Iterators.transform(invoiceQueryBean.iterator(),input -> input == null ? null :PersonLoanInvoiceQueryPojo.Builder.getInstance().addLoanInvoiceId(input.getLoanInvoiceId()).addUserName(input.getUserName()).addCertificateKind(input.getCertificateKind()).addCertificateNo(input.getCertificateNo()).addProductName(input.getProductName()).addMerchantName(input.getMerchantName()).addStoreName(input.getStoreName()).addApplyDate(input.getApplyDate()).addLoanAmount(input.getLoanAmount()).addLoanPeriod(input.getLoanPeriod()).addLoanPurpose(input.getLoanPurpose()).addLoanDate(input.getLoanDate()).addRate(input.getRate()).addChannelNo(input.getChannelNo()).addApproveDate(input.getApproveDate()).addReply(input.getReply()).addMarketingCenterId(input.getMarketingCenterId()).build()));}public class PersonLoanInvoiceQueryPojo implements Serializable{private static final long serialVersionUID = -408985049449365784L;private String loanInvoiceId;private String userId;private String userName;public static class Builder {private PersonLoanInvoiceQueryPojo instance = new PersonLoanInvoiceQueryPojo();private Builder(){}public static Builder getInstance() {return new Builder();}public static Builder getInstance(PersonLoanInvoiceQueryPojo instance){Builder builder = new Builder();builder.instance = instance;return builder;}public Builder addLoanInvoiceId(String loanInvoiceId) {this.instance.setLoanInvoiceId(loanInvoiceId);return this;}public Builder addUserId(String userId) {this.instance.setUserId(userId);return this;}public Builder addUserName(String userName) {this.instance.setUserName(userName);return this;}public PersonLoanInvoiceQueryPojo build() {return this.instance;}}setters();&getters();}⽰例三:⽅法引⽤ ⽅法引⽤主要有三类: (1)指向静态⽅法的⽅法引⽤,(例如:Integer中的parseInt⽅法,写作Integer::parseInt) (2)指向任意类型实例⽅法的⽅法引⽤(例如String中的length⽅法,写作String::length) (3)指向现有对象的实例⽅法的⽅法引⽤(如下例)import mon.collect.Iterators;import mon.collect.Lists;List<CreditPersonalInfoChangeApplySerial> applySerialList = new ArrayList<>();List<String> operatorNoList = Lists.newArrayList(Iterators.transform(applySerialList.iterator(), CreditPersonalInfoChangeApplySerial::getOperatorNo)); //这个叫做lambda的⽅法引⽤,注意⽅法引⽤的这个⽅法不需要()⽰例四: Lambad将List转换成Mapimport mon.collect.Maps;List<QueryUserAppInfoByUserIdListPojo> operatorInfoList = new ArrayList<>();Map<String, QueryUserAppInfoByUserIdListPojo> operatorMap= Maps.uniqueIndex(operatorInfoList.iterator(), QueryUserAppInfoByUserIdListPojo::getUserId);public class QueryUserAppInfoByUserIdListPojo implements Serializable {private static final long serialVersionUID = 6876288995978264269L;private String userId;public String getUserId() {return erId;}public void setUserId(String userId) {erId = userId;}}⽰例五:List<UserPojo> list = new ArrayList<>();list.forEach(input -> {if (input.getCertificateKind().equals(EnumCertificateKind.RESIDENT_IDENTITY_CARD)) {userCertificateMap.put(pojo.getUserId(), input);}});⽰例六: 遍历的时候需要使⽤到元素的索引,很可惜,Java8 的Iterable并没有提供⼀个带索引的forEach⽅法,⾃动动⼿写⼀个满⾜⾃⼰的需求。

guava bloomfilter使用

guava bloomfilter使用

guava bloomfilter使用Guava BloomFilter 使用BloomFilter是一种用于快速判断某个元素是否存在于一个集合中的数据结构。

它的特点是可以在不存储实际元素的情况下,通过哈希函数将元素映射到一个位图中,从而判断元素是否存在。

在Guava库中,提供了一个高效的BloomFilter实现,即Guava BloomFilter。

下面我们将介绍如何使用Guava BloomFilter,并探讨其在实际应用中的一些注意事项。

1. 引入Guava库要使用Guava BloomFilter,首先需要在项目中引入Guava库。

可以通过Maven或Gradle等方式将Guava库添加到项目依赖中。

2. 创建BloomFilter对象在使用Guava BloomFilter之前,我们需要先创建一个BloomFilter对象。

创建BloomFilter对象时需要指定元素的类型和预期插入的元素个数,以及期望的误判率。

示例代码如下:```BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8),10000, 0.01);```上述代码创建了一个存储String类型元素的BloomFilter对象,预期插入的元素个数为10000,期望的误判率为0.01。

3. 插入元素在创建BloomFilter对象后,我们可以通过`put`方法向BloomFilter中插入元素。

示例代码如下:```bloomFilter.put("element1");bloomFilter.put("element2");```上述代码将"element1"和"element2"两个元素插入到BloomFilter 中。

guava bloomfilter原理

guava bloomfilter原理

guava bloomfilter原理Guava Bloom Filter原理Bloom Filter是一种空间效率高、时间复杂度低的概率型数据结构,主要用于判断某个元素是否存在于一个集合中。

而Guava Bloom Filter则是Google Guava库中对Bloom Filter的实现。

一、Bloom Filter简介Bloom Filter由Burton Howard Bloom于1970年提出,它通过使用位数组和多个哈希函数来判断元素是否存在。

Bloom Filter的特点是具有较小的空间占用和快速的查询速度,但是它也存在一定的误判率,即查询结果可能会错误地判断某个元素存在于集合中。

二、Guava Bloom Filter原理Guava Bloom Filter是Google Guava库中的一个工具类,用于实现Bloom Filter。

它采用了BitSet来表示位数组,并且提供了多个哈希函数。

1. 初始化在使用Guava Bloom Filter之前,首先需要进行初始化。

初始化时需要指定预期插入的元素个数以及期望的误判率。

根据这两个参数,Guava Bloom Filter会计算出所需的位数组大小和哈希函数个数,并进行相应的初始化。

2. 插入元素插入元素时,首先需要将元素通过多个哈希函数映射到位数组中的多个位置,并将这些位置置为1。

具体而言,Guava Bloom Filter 会将元素通过多个哈希函数计算得到多个哈希值,然后将这些哈希值对位数组的大小取模,得到位数组中的多个位置,将这些位置置为1。

3. 查询元素查询元素时,首先需要将待查询的元素通过多个哈希函数映射到位数组中的多个位置,并判断这些位置是否都为1。

如果所有位置都为1,则表示该元素可能存在于集合中;如果有任意一个位置不为1,则表示该元素一定不存在于集合中。

4. 误判率Bloom Filter的误判率主要取决于位数组的大小和哈希函数的个数。

guava lists.newarraylist()的用法

guava lists.newarraylist()的用法

Lists.newArrayList() 是Google Guava 库中的一个实用方法,用于创建一个新的ArrayList 实例。

这个方法提供了一种更简洁、更易读的方式来创建ArrayList,而不需要每次都使用new ArrayList<>()。

这里是一个基本的使用示例:javaimport mon.collect.Lists;public class GuavaExample {public static void main(String[] args) {// 使用Guava 的Lists.newArrayList() 方法创建一个新的ArrayListList<String> myList = Lists.newArrayList("apple", "banana", "cherry");// 输出列表内容for (String fruit : myList) {System.out.println(fruit);}}}在这个例子中,我们导入了mon.collect.Lists 类,并使用Lists.newArrayList() 方法创建了一个新的包含三个字符串的ArrayList。

然后,我们使用一个增强的for 循环来遍历列表并打印其内容。

值得注意的是,从Java 9 开始,你也可以使用List.of() 或ArrayList::new 与双括号初始化来创建不可变或可变的列表,这可能会使Guava 的这种方法在某些情况下变得不那么必要。

然而,Guava 仍然提供了许多其他有用的集合实用程序和功能,因此它仍然是一个值得考虑的库。

对于不可变列表,你可以使用:javaList<String> immutableList = List.of("apple", "banana", "cherry");对于可变列表,你可以使用:javaList<String> mutableList = new ArrayList<>() {{add("apple");add("banana");add("cherry");}};但是,双括号初始化有一个缺点,它会创建一个匿名子类,这可能会导致额外的内存开销和潜在的序列化问题。

java2实用教程第六版知识点汇总

java2实用教程第六版知识点汇总

Java2实用教程第六版知识点汇总1.引言本文档旨在对Ja va2实用教程第六版涉及的主要知识点进行全面的汇总和总结。

通过学习该教程,读者将能够全面掌握Ja va2编程的核心概念和技巧,为日后的J av a开发工作打下坚实的基础。

2.数据类型J a va2实用教程第六版详细介绍了Ja va中的各种数据类型及其使用方法。

以下是一些关键的知识点:2.1基本数据类型J a va的基本数据类型包括整型、浮点型、字符型和布尔型。

本教程提供了详细的介绍和示例代码,帮助读者理解这些数据类型的特点和用法。

2.2引用数据类型除了基本数据类型外,J av a还提供了多种引用数据类型,如数组、类、接口等。

教程中的例子演示了如何声明和使用这些引用数据类型,帮助读者熟悉它们的基本概念和操作。

3.控制流程控制流程是编程中的重要概念,决定了程序的执行顺序和逻辑。

J a va2实用教程第六版涵盖了常见的控制流程语句,包括条件语句和循环语句。

3.1条件语句条件语句用于根据条件的真假来选择性地执行不同的代码块。

本教程提供了i f语句、swi t ch语句等条件语句的详细说明和示例,让读者明白如何正确运用它们。

3.2循环语句循环语句用于重复执行某段代码,直到满足退出条件为止。

Ja v a2实用教程第六版介绍了三种循环语句:f or循环、w hi le循环和d o-wh il e循环。

读者将学会如何正确选择和使用不同类型的循环语句,以解决各种实际问题。

4.类与对象面向对象编程是J ava的核心思想之一。

J a va2实用教程第六版详细讲解了类与对象的概念、属性和方法的定义与使用等内容。

4.1类的定义与使用教程中提供了清晰的例子,介绍了如何定义类、声明对象、调用类的方法等操作。

读者将了解到如何通过类和对象来构建复杂的应用程序。

4.2构造方法与析构方法构造方法用于在创建对象时进行初始化操作,而析构方法则在对象销毁时执行清理工作。

本教程详细说明了构造方法和析构方法的特点和使用方法,帮助读者正确地管理对象的生命周期。

java8 常用的方法汇总

java8 常用的方法汇总

java8 常用的方法汇总Java 8是一个非常重要的版本,引入了许多新的功能和改进,为开发人员提供了更好的工具和方法。

本文将总结Java 8中一些常用的方法,帮助读者更好地了解和使用这些功能。

1. Lambda表达式:Lambda表达式是Java 8引入的最重要的特性之一。

它可以用更简洁的语法实现函数式编程,使代码更加简洁和可读。

Lambda表达式可以用于替代匿名内部类的写法,从而使代码更加简洁。

2. Stream API:Stream API是Java 8中另一个重要的特性,它提供了一种新的处理集合的方式。

使用Stream API,可以更方便地对集合进行过滤、映射、排序和聚合等操作,使代码更加简洁和易于理解。

3. 方法引用:方法引用是Java 8中的另一个重要特性,它提供了一种更简洁的方式来引用已经存在的方法。

使用方法引用,可以将一个方法作为参数传递给另一个方法,使代码更加简洁和易于理解。

4. Optional类:Optional类是Java 8引入的一个新的类,用于解决空指针异常的问题。

使用Optional类,可以更好地处理可能为空的对象,避免空指针异常的发生。

5. 接口的默认方法:Java 8允许在接口中定义默认方法,这些方法可以有默认的实现。

这样一来,当接口的实现类没有实现默认方法时,会自动使用接口中定义的默认实现。

这样可以更方便地向已有的接口中添加新的方法,而不会破坏已有的实现。

6. 新的日期和时间API:Java 8引入了一个新的日期和时间API,用于替代旧的Date和Calendar类。

新的日期和时间API提供了更方便的日期和时间处理方式,使代码更加可读和易于维护。

7. CompletableFuture类:CompletableFuture类是Java 8中新增的一个类,用于实现异步编程。

使用CompletableFuture类,可以更方便地处理异步任务的结果,提高程序的性能和响应速度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Joiner(字符串合并)
连接对象数组 Joiner joiner = Joiner.on(";").skipNulls();//跳过空对象 String str = joiner.join("Harry", null, "Ron", "Hermione"); 连接Map Joiner.MapJoiner joinerMap = Joiner.on(";").useForNull("XX") .withKeyValueSeparator("=>");//键值之间的连接符 String result = joinerMap.join(map);
Objects(对象)
比较两个对象是否相等,会比较两个对象的hashcode Objects.equal("a", "b");
获取所有对象的hashCode值 int code = Objects.hashCode("a", "b"); 适合用于对象重写toString() String result = Objects.toStringHelper(this).add("x",x).add("str",str).toString(); 结果:类名{x=10,str=xxxx} 第一个不为空返回第一个,第一个不为空时返回第二个,都为空时抛出异常 Object s1 = Objects.firstNonNull("a", "b"); Object s2 = Objects.firstNonNull(null, "b"); Objects.firstNonNull(null, null);//异常
ArrayList
HashSet LinkedList* LinkedHashSet TreeSet ImmutableList
ImmutableSetMultimap
ImmutableMap
ImmutableSet
HashMultimap
初始化: Multimap<String, String> multimap = HashMultimap.create(); 统计对象个数 int size=multimap.size(); get(key) 返回一个集合 替换key的值
保留数字
String str4=CharMatcher.DIGIT.retainFrom(str);
移除数字
String str5=CharMatcher.DIGIT.removeFrom(str);
保留字符
String str6=CharMatcher.JAVA_LETTER.retainFrom(str);
Spliter(字符串分割)
Splitter splitter = Splitter.onPattern("o,") .omitEmptyStrings()//去除结果集中的空串 .trimResults();//去除前后端空格 Iterable<String> it = splitter.split(params); List<String> result= Lists.newArrayList(it);
CharMatcher(字符串比较器)
统计整数的个数
int countIn=CharMatcher.DIGIT.countIn(str);
统计字母的个数
int countCh=CharMatcher.JAVA_LETTER.countIn(str);
去除两端的空格,并把中间的连续空格替换成单个空格
IllegalArgumentException
conditions.checkArgument(1 == 2, "%s != %s", 1, 2);
IndexOutOfBoundsException
可用于检测索引是否数组的长度内:第1个参数是index,第2个参数是size Preconditions.checkPositionIndex(1, 2);
字符串处理 [string processing]
I/O 等等。 所有这些工具每天都在被Google的工程师应用在产品服务中。
Base 包
Preconditions Strings
Objects
Spliter
Joiner CharMatcher

Preconditions(异常检测)
Iterators(迭代器-详细用法)
List<String> list = Lists.newArrayList("a","b","c"); Iterator<String> source = list.iterator(); Iterator<String> result = Iterators.filter(source, new Predicate<String>() { @Override public boolean apply(@Nullable String s) { if (s.equals("b")) {//不包含b的字符串 return false;//去掉该对象 } return true;//保留该对象 } }); 与使用for的区别:
Map entriesDiffering = differenceMap.entriesDiffering();
两个map中都有相同的keys与values
Map entriesInCommon = differenceMap.entriesInCommon();
Multimap
Multimap:一种key可以重复的map(一个键映射到多个值) 底层实现:Map<K, Collection<V>> map,value为List或Set

Strings(字符串)
判断是否为null 或 "" boolean result = Strings.isNullOrEmpty(null); 字符长度填充 String str3 = Strings.padEnd("a2", 5, '*'); String str4 = Strings.padStart("a2", 5, '*'); 字符串复制 String str5 = Strings.repeat("a2", 2); 字符串为空值是使用null替代 String str1 = Strings.emptyToNull(""); 字符串为null则使用“”替代 String str2 = Strings.nullToEmpty(null); 公共前缀 String prefix = monPrefix(a, b); 公共后缀 String suffix = monSuffix(a, b);
String str1=CharMatcher.WHITESPACE.trimAndCollapseFrom(str, ' ');
用*号替换所有数字
String str2=CharMatcher.JAVA_DIGIT.replaceFrom(str, "*");
只保留数字和小写字母
String str3=CharMatcher.JAVA_DIGIT.or(CharMatcher.JAVA_LOWER_CASE).retainFrom(str);
NullPointerException
Preconditions.checkNotNull(null, "参数不能为%s", "null");
IllegalStateException
Preconditions.checkState(Objects.equal("XX", "??"), "%s != %s", "XX", ??");
Iterables(迭代器)
Iterables类用于Iterable的二次处理,大部分使用Iterators类中方法实现 iterable支持foreach方法,iterator不支持 for (Object item : iterable){} 过滤器(祥情见Iterators) Iterable result = Iterables.filter(iterable, predicate); 查找某个对象出现的次数 int count=Iterables.frequency(iterable,"b"); 是否存在某个对象 boolean exist = Iterables.any(iterable, predicate); 查找符合条件的对象 Object item = Iterables.find(iterable, predicate); 合并多个iterable,最多可支持4个参数 Iterable concat = Iterables.concat(iterable, iterable); getFirst getLast Object first = Iterables.getFirst(iterable, "NULL"); Object last = Iterables.getLast(iterable, "NULL");
Guava (google)
刘要华
2014-11-25
相关文档
最新文档