java中实现list或set转map的方法

java中实现list或set转map的方法

在开发中我们有时需要将list或set转换为map(比如对象属性中的唯一键作为map的key,对象作为map的value),一般的想法就是new一个map,然后把list或set中的值一个个push到map中。

类似下面的代码:

List<String> stringList = Lists.newArrayList("t1", "t2", "t3");
Map<String, String> map = Maps.newHashMapWithExpectedSize(stringList.size());
for (String str : stringList) {
  map.put(str, str);
}

是否还有更优雅的写法呢?答案是有的。

guava提供了集合(实现了Iterables接口或Iterator接口)转map的方法,方法定义如下:


/** 

* Returns an immutable map for which the {@link Map#values} are the given
 * elements in the given order, and each key is the product of invoking a
 * supplied function on its corresponding value.
 *
 * @param values the values to use when constructing the {@code Map}
 * @param keyFunction the function used to produce the key for each value
 * @return a map mapping the result of evaluating the function {@code
 *     keyFunction} on each value in the input collection to that value
 * @throws IllegalArgumentException if {@code keyFunction} produces the same
 *     key for more than one value in the input collection
 * @throws NullPointerException if any elements of {@code values} is null, or
 *     if {@code keyFunction} produces {@code null} for any value
 */
public static <K, V> ImmutableMap<K, V> uniqueIndex(
  Iterable<V> values, Function<? super V, K> keyFunction) {
 return uniqueIndex(values.iterator(), keyFunction);
} 

/**
 * Returns an immutable map for which the {@link Map#values} are the given
 * elements in the given order, and each key is the product of invoking a
 * supplied function on its corresponding value.
 *
 * @param values the values to use when constructing the {@code Map}
 * @param keyFunction the function used to produce the key for each value
 * @return a map mapping the result of evaluating the function {@code
 *     keyFunction} on each value in the input collection to that value
 * @throws IllegalArgumentException if {@code keyFunction} produces the same
 *     key for more than one value in the input collection
 * @throws NullPointerException if any elements of {@code values} is null, or
 *     if {@code keyFunction} produces {@code null} for any value
 * @since 10.0
 */
public static <K, V> ImmutableMap<K, V> uniqueIndex(
  Iterator<V> values, Function<? super V, K> keyFunction) {
 checkNotNull(keyFunction);
 ImmutableMap.Builder<K, V> builder = ImmutableMap.builder();
 while (values.hasNext()) {
  V value = values.next();
  builder.put(keyFunction.apply(value), value);
 }
 return builder.build();
}

这样我们就可以很方便的进行转换了,如下:

List<String> stringList = Lists.newArrayList("t1", "t2", "t3");
Map<String, String> map = Maps.uniqueIndex(stringList, new Function<String, String>() {
  @Override
  public String apply(String input) {
    return input;
  }
});

需要注意的是,如接口注释所说,如果Function返回的结果产生了重复的key,将会抛出异常。

java8也提供了转换的方法,这里直接照搬别人博客的代码:

@Test
public void convert_list_to_map_with_java8_lambda () {  

  List<Movie> movies = new ArrayList<Movie>();
  movies.add(new Movie(1, "The Shawshank Redemption"));
  movies.add(new Movie(2, "The Godfather"));  

  Map<Integer, Movie> mappedMovies = movies.stream().collect(
      Collectors.toMap(Movie::getRank, (p) -> p));  

  logger.info(mappedMovies);  

  assertTrue(mappedMovies.size() == 2);
  assertEquals("The Shawshank Redemption", mappedMovies.get(1).getDescription());
}

参考:http://www.jb51.net/article/104114.htm

时间: 2017-01-23

Java通过PropertyDescriptor反射调用set和get方法

本文实例为大家分享了PropertyDescriptor反射调用set和get方法,供大家参考,具体内容如下 第一段: package com.zhoushun; import java.lang.reflect.Method; import java.lang.reflect.Field; import java.beans.PropertyDescriptor; public class PropertyUtil { @SuppressWarnings("unchecked") p

详解Java中list,set,map的遍历与增强for循环

详解Java中list,set,map的遍历与增强for循环 Java集合类可分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. 关于增强for循环,需要注意的是,使用增强for循环无法访问数组下标值,对于集合的遍历其内部采用的也是Iterator的相关方法.如果只做简单遍历读取,增强for循环确实减轻不少的代码量. 集合概念: 1.作用:用于存放对象 2.相当于一个容器,里面包含着一组对象,其中的每个对象作为集合的一个元素出现 3.jav

利用Java Set 去除重复object的方法

实例如下: import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * 编写者:CP * <br />类描述:set集合针对String 类型和8大基础数据类型 过滤掉重复数据,如果存放的是其他类型对象,则需要重写hashCode方法和equals方法,当equals 比较相等时,则会去比较hashCode值 hashCode的值 如果一致的话,

Java 从Set里面取出有序的记录详解及实例

Java 从Set里面取出有序的记录详解及实例 Set里面的记录是无序的,如果想使用Set,然后又想里面的记录是有序的,就可以使用TreeSet,而不是HashSet,在使用TreeSet的时候,里面的元素必须是实现了Comparable接口的,TreeSet在进行排序的时候就是通过比较它们的Comparable接口的实现! 下面是HashSet的无序和TreeSet的有序的比较: Test类: import java.util.HashSet; import java.util.Iterato

Java中List Set和Map之间的区别_动力节点Java学院整理

Java集合的主要分为三种类型: • Set(集) • List(列表) • Map(映射) 要深入理解集合首先要了解下我们熟悉的数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),而JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. 世间上本来没有集合,(只有数组参考C语言)但有人想要,所以有了集合 有人想有可以自动扩展的数组,所以有了List 有的

Java中的HashSet详解和使用示例_动力节点Java学院整理

第1部分 HashSet介绍 HashSet 简介 HashSet 是一个没有重复元素的集合. 它是由HashMap实现的,不保证元素的顺序,而且HashSet允许使用 null 元素. HashSet是非同步的.如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步.这通常是通过对自然封装该 set 的对象执行同步操作来完成的.如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来"包装" set.

Java 中的HashMap详解和使用示例_动力节点Java学院整理

第1部分 HashMap介绍 HashMap简介 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射. HashMap 继承于AbstractMap,实现了Map.Cloneable.java.io.Serializable接口. HashMap 的实现不是同步的,这意味着它不是线程安全的.它的key.value都可以为null.此外,HashMap中的映射不是有序的. HashMap 的实例有两个参数影响其性能:"初始容量" 和 "加载因子&quo

ArrayList详解和使用示例_动力节点Java学院整理

第1部分 ArrayList介绍 ArrayList简介 ArrayList 是一个数组队列,相当于 动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口. ArrayList 继承了AbstractList,实现了List.它是一个数组队列,提供了相关的添加.删除.修改.遍历等功能. ArrayList 实现了RandmoAccess接口,即提

Java中LinkedList详解和使用示例_动力节点Java学院整理

第1部分 LinkedList介绍 LinkedList简介 LinkedList 是一个继承于AbstractSequentialList的双向链表.它也可以被当作堆栈.队列或双端队列进行操作. LinkedList 实现 List 接口,能对它进行队列操作. LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用. LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆. LinkedList 实现java.io.Serial

TreeSet详解和使用示例_动力节点Java学院整理

第1部分 TreeSet介绍 TreeSet简介 TreeSet 是一个有序的集合,它的作用是提供有序的Set集合.它继承于AbstractSet抽象类,实现了NavigableSet<E>, Cloneable, java.io.Serializable接口. TreeSet 继承于AbstractSet,所以它是一个Set集合,具有Set的属性和方法. TreeSet 实现了NavigableSet接口,意味着它支持一系列的导航方法.比如查找与指定目标最匹配项. TreeSet 实现了Cl

Java 中的FileReader和FileWriter源码分析_动力节点Java学院整理

FileReader和FileWriter源码分析 1. FileReader 源码(基于jdk1.7.40) package java.io; public class FileReader extends InputStreamReader { public FileReader(String fileName) throws FileNotFoundException { super(new FileInputStream(fil java io系列21之 InputStreamReade

Java中的InputStreamReader和OutputStreamWriter源码分析_动力节点Java学院整理

InputStreamReader和OutputStreamWriter源码分析 1. InputStreamReader 源码(基于jdk1.7.40) package java.io; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import sun.nio.cs.StreamDecoder; // 将"字节输入流"转换成"字符输入流" public class

Java中的静态内部类详解及代码示例

1. 什么是静态内部类 在Java中有静态代码块.静态变量.静态方法,当然也有静态类,但Java中的静态类只能是Java的内部类,也称为静态嵌套类.静态内部类的定义如下: public class OuterClass { static class StaticInnerClass { ... } } 在介绍静态内部类之前,首先要弄清楚静态内部类与Java其它内部类的区别. 2. 内部类 什么是内部类?将一个类的定义放在另一个类的内部,就是内部类.Java的内部类主要分为成员内部类.局部内部类.

Java中Volatile关键字详解及代码示例

一.基本概念 先补充一下概念:Java内存模型中的可见性.原子性和有序性. 可见性: 可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉.通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情.为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制. 可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的.也就是一个线程修改的结果.另一个线程马上就能看到.比如:用volatile修饰的变量,就会具有可见性.volatile修饰的