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

guava 集合转换

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 集合转换

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

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

相关文章

CRC校验算法的解析,暨对网上的CRC详解的补充

一、CRC的形象理解 本文面向对CRC校验有一定基础的读者&#xff0c;如果你不懂&#xff0c;请戳这里。维基百科还有图解版的。 在CRC的具体实现中&#xff0c;如果要计算CRC的数据很长&#xff0c;一般都会用到寄存器&#xff0c;用来保存当前的计算到的CRC&#xff0c;循环计算…

7.5 GRASP原则五:高内聚 High Cohesion

GRASP原则五&#xff1a;高内聚 High Cohesion   How to keep objects focused, understandable and manageable, and as a side effect support Low Coupling? 如何使对象功能专注、可理解、可管理&#xff0c;同时又支持 低耦合&#xff1f;5.1 GRASP rule 5&#xff1…

资源泄漏:救援的命令模式

多年来&#xff0c; 使用Plumbr进行性能监视时&#xff0c;我遇到了数百个资源泄漏引起的性能问题。 在这篇文章中&#xff0c;我想描述一种最简单的方法来清理资源并避免该问题。 首先&#xff0c;我以电影播放器​​应用程序为例来描述问题。 这种应用程序的主要功能自然是在…

Word文字的三种隐藏方法

在Word的使用过程中&#xff0c;有时候可能需要这么一种情况&#xff1a;一些文字或者段落我们暂时不需要&#xff0c;但又不知后期是否用到&#xff0c;其碍眼却又不能删除。这个时候&#xff0c;最好的方法就是暂时隐藏文字或者段落。今天寻老师教大家三种隐藏Word文本的方法…

Video 对象方法 canPlayType()

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <p>我的浏览器可以播放 MP4 视频吗?<span> <button οnclick"supportType(e…

Linux下区分物理CPU、逻辑CPU和CPU核数

㈠ 概念 ① 物理CPU 实际Server中插槽上的CPU个数 物理cpu数量&#xff0c;可以数不重复的 physical id 有几个 ② 逻辑CPU Linux用户对 /proc/cpu…

java原子更新类_Java内部具有原子更新的动态热交换环境

java原子更新类有人可能会争辩说上述标题可以简称为OSGi &#xff0c;我想在一开始就放弃这种思考过程。 对于OSGi而言&#xff0c;这没有什么冒犯的&#xff0c;它是一个很棒的规范&#xff0c;在实现层或可用性层上都搞砸了&#xff0c;这就是我对OSGi的信念。 当然&#xf…

5个构建Spring Boot API的实用技巧

建筑物身份管理&#xff0c;包括身份验证和授权&#xff1f; 尝试Stormpath&#xff01; 我们的REST API和强大的Java SDK支持可以消除您的安全风险&#xff0c;并且可以在几分钟内实现。 注册 &#xff0c;再也不会建立auth了&#xff01; 每个API开发人员都在寻找一种更安全…

C++项目目录组织结构

项目目录结构的问题基本上是个仁者见仁&#xff0c;智者见智的问题&#xff0c;只要自己用着顺手&#xff0c;使用什么样的目录组织结构是没有什么大碍的。当然如果项目很大&#xff0c;参与的人员很多&#xff0c;那么合理的组织一下目录结构还是会有很大的益处的。不同类型的…

火绒杀毒软件更安静

https://www.huorong.cn/转载于:https://www.cnblogs.com/Tom-yi/p/10554564.html

完全编译安装boost

文章目录 1. 安装依赖2. 编译安装 boost3. 环境变量配置 boost是C世界中相当优秀的第三方库&#xff0c;被选入STL的也有不少&#xff0c;其中用到的C奇技淫巧更是数不胜数。 安装依赖 boost 在类 Unix 系统上的安装&#xff0c;可以参考官方文档的 Get Started&#xff0c;除此…

c#Md5 32位加密结果少了两个0的原因

我们的&#xff1a; e1adc3949ba59abbe56e57f20f883e 第三方的&#xff1a;e10adc3949ba59abbe56e057f20f883e 原因: 这个是很常见的错误&#xff0c;你字节转换成字符串的时候要保证是2位宽度啊&#xff0c;某个字节为0转换成字符串的时候必须是00的&#xff0c;否则就会丢失…

lambdas for_Wordcounter,使用Lambdas和Fork / Join计算Java中的单词数

lambdas for这些天来&#xff0c;我发布了Wordcounter &#xff0c;这是一个Java库和命令行实用程序&#xff0c;用于对文本文件中的单词进行计数并对单词计数进行分析&#xff0c;从而大量使用了功能编程结构和并行计算方法。 这是我在“令人讨厌的快速问答”大赛第四个条目SA…

Bitmap Font生成

工具&#xff1a;AngelCode 的 Bitmap Font Generator。把需要用到的文字写到一个txt&#xff0c;注意编码为Unicode。接着&#xff0c;在工具里 Edit->select chars from file选择刚才新建的txt文件。然后。。。之后的没啥细节&#xff0c;随意搞吧。转载于:https://www.cn…

分隔和截断字符串, boost string algorithm library中的split和trim

http://www.boost.org/doc/libs/1_46_1/doc/html/string_algo.html 这个库是个 headers only library  这个库提供了STL没有提供的 string-related算法, 但是实现做到了可以用在任何 character 的 container上 split 在写在线状态的改造时候要把一个字符串中描述的几种类型拆…

使用Spring Integration重试RabbitMQ

我最近阅读了有关使用RabbitMQ重试的方法 在这里&#xff0c;并想尝试类似的方法 Spring Integration &#xff0c;提供了一组很棒的集成抽象。 TL; DR解决的问题是重试一次消息&#xff08;在处理失败的情况下&#xff09;&#xff0c;两次重试之间有较大的延迟&#xff08…

Vue_(Router路由)-vue-router路由的基本用法

vue-router官网&#xff1a;传送门 vue-router起步&#xff1a;传送门 vue-router路由&#xff1a;Vue.js官网推出的路由管理器&#xff0c;方便的构建单页应用 单页应用&#xff1a;Single Page Application简称SPA&#xff0c;只有一个web页面的应用&#xff0c;用户与应用交…

利用boost做string到wstring转换,以及字符集转换

#include <boost/locale.hpp> int _tmain(int argc, _TCHAR* argv[]) {//std::locale::global(std::locale("utf-8"));std::locale::global(std::locale("")); // 设置全局的C运行库locale 可以针对cout fstream等单独设置 空表示默认使用当前系统…

P4198 楼房重建

[Luogu4198] 原题解 19.3.21 用线段树维护有关单调栈的问题 不要pushdown , 但是pushup的时候需要特别注意. 19.3.31 这里的\(pushup2\)其实就是几个特判 : 没有 , 直接返回当前区间答案 , 区间长度为\(1\) , 以及剩下两大类 , 这里有一个模板 : if(mx[ls]<tmp) return push…

Linux多线程实践(1) --线程理论

线程概念 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列/指令序列”; 一切进程至少有一个执行线程; 进程 VS. 线程 1.进程是资源分配(进程需要参与资源的竞争)的基本单位,而线程是处理器调…