`
pxy801213
  • 浏览: 4188 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Guava Collection/List transform 陷阱

    博客分类:
  • Java
阅读更多

首先看段代码吧.

 

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]]
结果B
[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]]

 

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]]

 

可以看到之前List里面是String, transform之后List内容变成了Person

 

0
0
分享到:
评论

相关推荐

    guava-19.0 jar和sources

    Guava是Google开发的一个核心库,它为Java平台提供了许多实用工具类,极大地丰富了标准库的功能。在Java开发中,Guava库被广泛使用,因为它包含了大量的集合框架、并发支持、缓存机制、字符串处理、I/O操作等多个...

    Guava 工程项目包 有实例

    - **集合框架**:Guava 提供了丰富的集合类,如 Multiset(多集)、Multimap(多映射)、ImmutableCollection(不可变集合)等,它们扩展了 Java 集合框架,提供了更强大和灵活的数据结构。 - **缓存**:Guava ...

    guava-28.1-jre.jar

    javaweb/javaee 常用jar包,亲测可用,若需其他版本其他jar包请留言我看到后会上传分享

    guava,google项目名称、集合、缓存、原语支持、并发库、公共注释、字符串处理、i/o。美国石油学会.zip

    1. 集合框架:Guava对Java的集合框架进行了扩展,引入了如Multiset(多集)、Multimap(多映射)、ImmutableCollection(不可变集合)等更灵活的数据结构,这些集合在处理特定场景时能提供更好的性能和便捷性。...

    guava collection简介1

    Guava Collections 是 Google 的工程师 Kevin Bourrillion 和 Jared Levy 创作的一个开源库,利用他们在公司内部“20%”自由时间开发的成果。这个库是对 Java Collections Framework 的一个增强和扩展,旨在提供更...

    guava-19.0.jar

    (摘自开源中国)Guava 中文是石榴的意思,该项目是 Google 的一个开源项目,包含许多 Google 核心的 Java 常用库。 目前主要包含: ...下载地址:https://repo1.maven.org/maven2/com/google/guava/guava/

    Guava-21.0 JAR/SRC/DOC 三和一

    Guava是Google开发的一个核心库,它为Java开发人员提供了许多实用工具类,极大地提高了开发效率。Guava 21.0是这个库的一个特定版本,包含了大量的优化和改进。这个压缩包集成了JAR(Java Archive)、SRC(源代码)...

    java集合分组(Guava)

    Java集合框架是编程中不可或缺的一部分,它提供了丰富的数据结构和操作接口,如List、Set、Map等。然而,有时候我们可能需要对集合数据进行更复杂的处理,比如分组,这时Guava库就显得非常有用。Guava是Google推出的...

    guava-api16/17/18chm

    《Guava API 16/17/18 深度解析》 Guava是Google推出的一个Java库,它包含一系列高效的、经过充分测试的、用于解决常见编程问题的工具类。Guava API 16/17/18版本的发布,为开发者提供了更加丰富和强大的功能。本文...

    Getting Started with Google Guava code

    **Google Guava简介** Google Guava 是一个广泛使用的开源库,为Java开发人员提供了一系列实用工具类和集合框架。这个库旨在简化常见的编程任务,提高代码的可读性和可维护性。Guava 提供了丰富的功能,包括缓存、...

    Guava入门指南培训PPT

    ### Guava入门指南知识点详解 #### 一、Guava概述 Guava是Google推出的一款开源核心类库,它为Java开发者提供了丰富的工具类和实用工具集合。Guava旨在提高编程效率的同时确保代码的高质量和稳定性。它包含了大量...

    Google Guava library 14.0 参考文档

    Google开源了内部Java项目所用的Java库,并取名为Guava库(guava是番石榴的意思)。Guava库旨在提供核心JDK 1.6 API所没有的常用功能。这是最新的14.0版本的参考文档,已经编译成chm格式,方便使用。

    springboot本地缓存(guava与caffeine).docx

    Spring Boot 本地缓存(Guava 与 Caffeine) Spring Boot 中的本地缓存是指在应用程序中存储和检索数据的机制,以提高应用程序的性能和响应速度。在本地缓存中,我们可以使用 Guava 或 Caffeine 等库来实现缓存...

    guava(google的java集合包)

    Guava是Google为Java平台设计的一个开源库,它极大地扩展了Java的标准库,尤其是在集合、缓存、并发和I/O等方面。Guava的核心特性包括: 1. **集合框架增强**:Guava提供了丰富的集合类,如Multiset(多集)、...

    Guava教程1使用GoogleCollections,G

    List&lt;Integer&gt; lengths = Lists.transform(names, new Function, Integer&gt;() { @Override public Integer apply(String name) { return name.length(); } }); ``` 6. **并发支持** Guava提供了强大的并发...

    guava-23.0.zip guava.jar guava

    1. **集合框架**:Guava提供了丰富的集合类,如Multiset(多集)、Multimap(多映射)、ImmutableCollection(不可变集合)等,这些集合类具有更好的性能和功能,比Java内置的集合类更为强大。 2. **缓存机制**:...

    Getting start with guava

    ### Guava库入门指南 #### 一、简介与背景 Google Guava库是谷歌公司推出的一个开源项目,它为Java开发者提供了丰富的工具类和API,旨在帮助开发者编写更高效、简洁且可维护的代码。Guava库包含了大量实用功能,如...

    google开源项目guava.jar包

    Guava还引入了ImmutableCollection(不可变集合),确保集合一旦创建就无法修改,提高了代码的安全性。 在并发编程方面,Guava提供了强大的工具,如ListenableFuture,它允许开发者注册回调函数来处理异步任务的...

    guava-18.0(guava-18.0.jar和guava-18.0-sources.jar)

    Guava是Google开发的一个核心库,它为Java平台提供了许多实用工具类,涵盖了集合、并发、I/O、字符串处理、数学运算等多个方面。这个压缩包包含的是Guava库的18.0版本,分为两个部分:`guava-18.0.jar`和`guava-18.0...

    Guava 16.0 API (CHM格式)

     官方下载: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  源码包的简单...

Global site tag (gtag.js) - Google Analytics