首先看段代码吧.
package demo.collection.transform; import java.util.List; import com.google.common.collect.Lists; import demo.util.vo.Person; public class GuavaList { public static void main(String[] args) throws Exception { List<String> names = Lists.newArrayList("Andy", "Bob"); List<Person> persons = Lists.transform(names, name -> new Person(name, 12)); System.out.println(persons); // 设置所有age到20 for (Person person : persons) { person.setAge(20); } System.out.println(persons); } }
Person 有两个属性, Name和Age.
问题来了, 在for循环里把每个person的age改完后, 会打印出什么来呢? 是结果A还是B?
结果A
[Person [name=Andy, age=12], Person [name=Bob, age=12]]
[Person [name=Andy, age=20], Person [name=Bob, age=20]]
[Person [name=Andy, age=20], Person [name=Bob, age=20]]
结果B
[Person [name=Andy, age=12], Person [name=Bob, age=12]]
[Person [name=Andy, age=12], Person [name=Bob, age=12]]
[Person [name=Andy, age=12], Person [name=Bob, age=12]]
正确是结果B. 具体原因看下源码就知道了, transform之后会返回一个TransformingSequentialList. 这个list会让每次被遍历的时候, 都会调用transform的function. 而导致每次生成新的Person.
同时介绍下其他的两种transform
- JDK 8 Stream Transform
- Apache Transform
JDK 8 Stream Transform 可以产生结果A
package demo.collection.transform; import java.util.List; import java.util.stream.Collectors; import com.google.common.collect.Lists; import demo.util.vo.Person; public class JdkStream { public static void main(String[] args) throws Exception { List<String> names = Lists.newArrayList("Andy", "Bob"); List<Person> persons = names.stream().map(name -> new Person(name, 12)).collect(Collectors.toList()); System.out.println(persons); // 设置所有age到20 for (Person person : persons) { person.setAge(20); } System.out.println(persons); } }
结果
[Person [name=Andy, age=12], Person [name=Bob, age=12]]
[Person [name=Andy, age=20], Person [name=Bob, age=20]]
[Person [name=Andy, age=20], Person [name=Bob, age=20]]
Apache Transform 可以产生结果A, 但是是改变了原List的内容.
package demo.collection.transform; import java.util.List; import org.apache.commons.collections.CollectionUtils; import com.google.common.collect.Lists; import demo.util.vo.Person; public class ApacheTransform { public static void main(String[] args) throws Exception { List<Object> objects = Lists.newArrayList("Andy", "Bob"); CollectionUtils.transform(objects, name -> new Person((String) name, 12)); System.out.println(objects); // 设置所有age到20 for (Object person : objects) { ((Person) person).setAge(20); } System.out.println(objects); } }
结果
[Person [name=Andy, age=12], Person [name=Bob, age=12]]
[Person [name=Andy, age=20], Person [name=Bob, age=20]]
[Person [name=Andy, age=20], Person [name=Bob, age=20]]
可以看到之前List里面是String, transform之后List内容变成了Person
相关推荐
Guava是Google开发的一个核心库,它为Java平台提供了许多实用工具类,极大地丰富了标准库的功能。在Java开发中,Guava库被广泛使用,因为它包含了大量的集合框架、并发支持、缓存机制、字符串处理、I/O操作等多个...
- **集合框架**:Guava 提供了丰富的集合类,如 Multiset(多集)、Multimap(多映射)、ImmutableCollection(不可变集合)等,它们扩展了 Java 集合框架,提供了更强大和灵活的数据结构。 - **缓存**:Guava ...
javaweb/javaee 常用jar包,亲测可用,若需其他版本其他jar包请留言我看到后会上传分享
1. 集合框架:Guava对Java的集合框架进行了扩展,引入了如Multiset(多集)、Multimap(多映射)、ImmutableCollection(不可变集合)等更灵活的数据结构,这些集合在处理特定场景时能提供更好的性能和便捷性。...
Guava Collections 是 Google 的工程师 Kevin Bourrillion 和 Jared Levy 创作的一个开源库,利用他们在公司内部“20%”自由时间开发的成果。这个库是对 Java Collections Framework 的一个增强和扩展,旨在提供更...
(摘自开源中国)Guava 中文是石榴的意思,该项目是 Google 的一个开源项目,包含许多 Google 核心的 Java 常用库。 目前主要包含: ...下载地址:https://repo1.maven.org/maven2/com/google/guava/guava/
Java集合框架是编程中不可或缺的一部分,它提供了丰富的数据结构和操作接口,如List、Set、Map等。然而,有时候我们可能需要对集合数据进行更复杂的处理,比如分组,这时Guava库就显得非常有用。Guava是Google推出的...
Guava是Google开发的一个核心库,它为Java开发人员提供了许多实用工具类,极大地提高了开发效率。Guava 21.0是这个库的一个特定版本,包含了大量的优化和改进。这个压缩包集成了JAR(Java Archive)、SRC(源代码)...
《Guava API 16/17/18 深度解析》 Guava是Google推出的一个Java库,它包含一系列高效的、经过充分测试的、用于解决常见编程问题的工具类。Guava API 16/17/18版本的发布,为开发者提供了更加丰富和强大的功能。本文...
**Google Guava简介** Google Guava 是一个广泛使用的开源库,为Java开发人员提供了一系列实用工具类和集合框架。这个库旨在简化常见的编程任务,提高代码的可读性和可维护性。Guava 提供了丰富的功能,包括缓存、...
### Guava入门指南知识点详解 #### 一、Guava概述 Guava是Google推出的一款开源核心类库,它为Java开发者提供了丰富的工具类和实用工具集合。Guava旨在提高编程效率的同时确保代码的高质量和稳定性。它包含了大量...
Google开源了内部Java项目所用的Java库,并取名为Guava库(guava是番石榴的意思)。Guava库旨在提供核心JDK 1.6 API所没有的常用功能。这是最新的14.0版本的参考文档,已经编译成chm格式,方便使用。
Spring Boot 本地缓存(Guava 与 Caffeine) Spring Boot 中的本地缓存是指在应用程序中存储和检索数据的机制,以提高应用程序的性能和响应速度。在本地缓存中,我们可以使用 Guava 或 Caffeine 等库来实现缓存...
Guava是Google为Java平台设计的一个开源库,它极大地扩展了Java的标准库,尤其是在集合、缓存、并发和I/O等方面。Guava的核心特性包括: 1. **集合框架增强**:Guava提供了丰富的集合类,如Multiset(多集)、...
List<Integer> lengths = Lists.transform(names, new Function, Integer>() { @Override public Integer apply(String name) { return name.length(); } }); ``` 6. **并发支持** Guava提供了强大的并发...
### Guava库入门指南 #### 一、简介与背景 Google Guava库是谷歌公司推出的一个开源项目,它为Java开发者提供了丰富的工具类和API,旨在帮助开发者编写更高效、简洁且可维护的代码。Guava库包含了大量实用功能,如...
Guava还引入了ImmutableCollection(不可变集合),确保集合一旦创建就无法修改,提高了代码的安全性。 在并发编程方面,Guava提供了强大的工具,如ListenableFuture,它允许开发者注册回调函数来处理异步任务的...
1. **集合框架**:Guava提供了丰富的集合类,如Multiset(多集)、Multimap(多映射)、ImmutableCollection(不可变集合)等,这些集合类具有更好的性能和功能,比Java内置的集合类更为强大。 2. **缓存机制**:...
Guava是Google开发的一个核心库,它为Java平台提供了许多实用工具类,涵盖了集合、并发、I/O、字符串处理、数学运算等多个方面。这个压缩包包含的是Guava库的18.0版本,分为两个部分:`guava-18.0.jar`和`guava-18.0...
官方下载:http://code.google.com/p/guava-libraries/downloads/list 官方文档:http://docs.guava-libraries.googlecode.com/git/javadoc http://www.ostools.net/apidocs/apidoc?api=guava 源码包的简单...