Groovy的便利之一是能够通过Groovy的闭包支持轻松地对集合执行过滤和转换操作。 Guava将对集合的过滤和转换引入标准Java,这是本文的主题。

Guava的Collections2类具有两个公共方法,这两个方法都是静态的。 方法filter(Collection,Predicate)和transform(Collection,Function)的作用含义是:分别对给定的集合执行过滤和转换。 要过滤或转换的集合是每个静态方法的第一个参数。 过滤函数的第二个参数是Guava的Predicate类的实例。 转换函数的第二个参数是Guava的Function类的实例。 这篇文章的其余部分展示了如何将所有这些结合在一起以过滤和转换Java集合。

使用番石榴过滤收藏

使用番石榴过滤集合非常简单。 下面的代码片段演示了一个简单的示例。 提供了一个String Set (未在代码片段中显示,但在代码后的输出中显而易见),并且仅对以大写字母“ J”开头的条目过滤了所提供的Set 。 这是通过使用Java正则表达式支持和Guava的Predicates.containsPattern(String)来完成的 ,但是还可以指定其他类型的Predicate 。

过滤以'J'开头的字符串

/*** Demonstrate Guava's Collections2.filter method. Filter String beginning * with letter 'J'.*/public static void demonstrateFilter(){printHeader('Collections2.filter(Collection,Predicate): 'J' Languages');final Set<String> strings = buildSetStrings();out.println('\nOriginal Strings (pre-filter):\n\t' + strings);final Collection<String> filteredStrings =Collections2.filter(strings, Predicates.containsPattern('^J'));out.println('\nFiltered Strings:\n\t' + filteredStrings);out.println('\nOriginal Strings (post-filter):\n\t' + strings);}

接下来显示运行上述方法的输出。 此输出显示了构成buildSetStrings()返回的原始String Set的冗长的编程语言列表,并显示了仅包含以'J'开头的那些编程语言的过滤器调用的结果。

使用番石榴改变收藏

使用Guava转换集合类似于语法过滤,但使用Function来指定如何将源集合条目“转换”为输出集合,而不是使用Predicate来确定要保留哪些条目。 以下代码段演示了如何将给定集合中的条目转换为自身的大写版本。

将条目转换为大写

/*** Demonstrate Guava's Collections2.transform method. Transform input* collection's entries to uppercase form.*/public static void demonstrateTransform(){printHeader('Collections2.transform(Collection,Function): Uppercase');final Set<String> strings = buildSetStrings();out.println('\nOriginal Strings (pre-transform):\n\t' + strings);final Collection<String> transformedStrings = Collections2.transform(strings, new UpperCaseFunction<String, String>());out.println('\nTransformed Strings:\n\t' + transformedStrings);out.println('\nOriginal Strings (post-transform):\n\t' + strings);}

上面的转换代码片段使用了一个名为UpperCaseFunction的类,但是在Guava API文档中找不到该类。 这是一个自定义类,如下面的代码清单所示。

UpperCaseFunction.java

package dustin.examples;import com.google.common.base.Function;/*** Simple Guava Function that converts provided object's toString() representation* to upper case.* * @author Dustin*/
public class UpperCaseFunction<F, T> implements Function<F, T>
{@Overridepublic Object apply(Object f){return f.toString().toUpperCase();}
}

接下来显示运行使用UpperCaseFunction类的转换代码段的输出。

上面的代码段显示了专用于使用Guava过滤和转换集合条目的方法。 接下来显示主要类的完整代码清单。

GuavaCollections2.java

package dustin.examples;import static java.lang.System.out;import com.google.common.base.Predicates;
import com.google.common.collect.Collections2;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;/*** Class whose sole reason for existence is to demonstrate Guava's Collections2* class.* * @author Dustin*/
public class GuavaCollections2
{/*** Provides a Set of Strings.* * @return Set of strings representing some programming languages.*/private static Set<String> buildSetStrings(){final Set<String> strings = new HashSet<String>();strings.add('Java');strings.add('Groovy');strings.add('Jython');strings.add('JRuby');strings.add('Python');strings.add('Ruby');strings.add('Perl');strings.add('C');strings.add('C++');strings.add('C#');strings.add('Pascal');strings.add('Fortran');strings.add('Cobol');strings.add('Scala');strings.add('Clojure');strings.add('Basic');strings.add('PHP');strings.add('Flex/ActionScript');strings.add('JOVIAL');return strings;}/*** Demonstrate Guava's Collections2.filter method. Filter String beginning * with letter 'J'.*/public static void demonstrateFilter(){printHeader('Collections2.filter(Collection,Predicate): 'J' Languages');final Set<String> strings = buildSetStrings();out.println('\nOriginal Strings (pre-filter):\n\t' + strings);final Collection<String> filteredStrings =Collections2.filter(strings, Predicates.containsPattern('^J'));out.println('\nFiltered Strings:\n\t' + filteredStrings);out.println('\nOriginal Strings (post-filter):\n\t' + strings);}/*** Demonstrate Guava's Collections2.transform method. Transform input* collection's entries to uppercase form.*/public static void demonstrateTransform(){printHeader('Collections2.transform(Collection,Function): Uppercase');final Set<String> strings = buildSetStrings();out.println('\nOriginal Strings (pre-transform):\n\t' + strings);final Collection<String> transformedStrings = Collections2.transform(strings, new UpperCaseFunction<String, String>());out.println('\nTransformed Strings:\n\t' + transformedStrings);out.println('\nOriginal Strings (post-transform):\n\t' + strings);}/*** Print a separation header including the provided text.* * @param headerText Text to be included in separation header.*/private static void printHeader(final String headerText){out.println('\n==========================================================');out.println('== ' + headerText);out.println('==========================================================');}/*** Main function for demonstrating Guava's Collections2 class.* * @param arguments */public static void main(final String[] arguments){demonstrateFilter();demonstrateTransform();}
}

在结束本文之前,这里需要注意一个重要的注意事项。 在Collections2类上定义的这两种方法在其Javadoc文档中均包含有关其使用的警告。 两种方法都提供了被视为原始集合“实时视图”的集合,因此“对一个集合的更改会影响另一个集合”。 例如,从源集合中删除元素类似地将其从转换后的集合中删除。 每个方法的文档还警告即使源集合是可序列化的和/或线程安全的,也不会返回可序列化或线程安全的集合。

结论

Guava使使用Java过滤集合和转换集合条目变得更加容易。 尽管执行类似操作的代码可能不如Groovy简洁,但是它比不使用Guava的Collections2类编写直接Java代码要好。 Java集合可以使用Collections2.filter(Collection,Predicate)进行过滤,也可以使用Collections2.transform(Collection,Function)

参考:在Inspired by Actual Events博客上,我们的JCG合作伙伴 Dustin Marx 用Guava的Collections2过滤和转换Java集合 。

翻译自: https://www.javacodegeeks.com/2012/11/guavas-collections2-filtering-and-transforming-java-collections.html

Guava的Collections2:过滤和转换Java集合相关推荐

  1. guava 集合转换_Guava的Collections2:过滤和转换Java集合

    guava 集合转换 Groovy的便利之一是能够通过Groovy的闭包支持轻松地对集合执行过滤和转换操作. Guava将对集合的过滤和转换引入标准Java,这是本文的主题. Guava的Collec ...

  2. JAVA集合与字符串转换

    JAVA集合与字符串转换 集合与字符串转换 集合与字符串转换 这里面包含的内容麻雀虽小五脏俱全,常用的一些java遍历,JDK1.8新特性实用,任意对象排序分组,字符串切割,集合切割,字符串转集合,集 ...

  3. java集合——集合与数组间的转换+算法

    [0]README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java集合--集合与数组间的转换+算法 的相关知识: 0.2) for full sour ...

  4. js 中转换成list集合_程序员:java集合介绍-List,具说很详细,你不来看看?

    Java集合介绍 作为一个程序猿,Java集合类可以说是我们在工作中运用最多.最频繁的类.相比于数组(Array)来说,集合类的长度可变,更加方便开发. Java集合就像一个容器,可以存储任何类型的数 ...

  5. scala集合和java集合的转换-List

    scala集合和java集合的转换-List scala的List要想转换成java的list 需要导入对应的类scala.collection.JavaConverters._ import jav ...

  6. Java集合Map,set, list 之间的转换

    Java集合Map,set, list 之间的转换 前言: 通过思维导图复习联系,看到一个HashMap排序题上机题之后有的一个感想,题目如下,看看你能时间出来么? 已知一个HashMap<In ...

  7. Java 集合 --- Array和List互相转换

    Java 集合 --- Array和List互相转换 List 转 Array Array 转 List 包装类数组和基本类型数组互相转换 List 转 Array 使用toArray方法只能返回 O ...

  8. scala to java_Scala 2.13 以后Java集合与Scala集合互相转换

    原来需要Java集合和Scala集合类型互换时引入import scala.collection.JavaConverters._1 即可,但在Scala 2.13版本中JavaConverter已经 ...

  9. java集合的功能_功能性Java集合

    java集合的功能 如今,在功能上大肆宣传,因此至少在Java集合方面,我会简要概述一下. 我个人喜欢标准 集合API,但在某些情况下可能会很尴尬并添加其他详细信息. 在Java 8+的更高版本中,这 ...

最新文章

  1. java数据类型的一些注意事项
  2. Matlab cell矩阵处理
  3. 来自微博html5怎么设置,来自微博的面试题解决方案
  4. python中的单下划线和双下划线_python中的单下划线和双下划线
  5. Working context and Functional profile
  6. 开发基础之使用git把项目提交到github托管
  7. IntelliJ IDEA内部设计
  8. 解决:未能将管道连接到虚拟机: 所有的管道范例都在使用中。
  9. dedecms--在后台增加会员添加
  10. python自动化测试脚本怎么编写_【Python + uiautomator2】之编写unittest自动化测试脚本...
  11. 如何在程序中画出实际大小为7CM半径的圆
  12. java实现红包要多少钱_Java实现抢红包功能
  13. python小项目(-)图片转字符画
  14. 41.Linux/Unix 系统编程手册(下) -- 共享库基础
  15. 微信小程序教程笔记7
  16. 计算机网络第七版课后答案(谢希仁版)
  17. java 生成中文字符乱码,java汉字乱码的原因与解决方法
  18. Word基础(八)带圈字符
  19. FreeMind 思维导图的使用
  20. 做销售如何有效地维护好与客户的关系

热门文章

  1. python3安装mysql模块_Python安装MySQL库详解,步骤及错误的解决方法
  2. tomcat(12)org.apache.catalina.core.StandardContext源码剖析
  3. eclipse创建神经网络_使用Eclipse Deeplearning4j构建简单的神经网络
  4. 纹理和基元_通过粘性仙人掌基元进行延迟加载和缓存
  5. java ee的小程序_Java EE调度程序
  6. 解耦,未解耦的区别_幂等与时间解耦之旅
  7. 无服务器:不费吹灰之力!
  8. Spring Security与Maven教程
  9. 早期更多失败– Java 8
  10. 微服务系列:MicroProfile和Apache TomEE