java中實現(xiàn)list或set轉(zhuǎn)map的方法
java中實現(xiàn)list或set轉(zhuǎn)map的方法
在開發(fā)中我們有時需要將list或set轉(zhuǎn)換為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); }
是否還有更優(yōu)雅的寫法呢?答案是有的。
guava提供了集合(實現(xiàn)了Iterables接口或Iterator接口)轉(zhuǎn)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(); }
這樣我們就可以很方便的進行轉(zhuǎn)換了,如下:
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返回的結(jié)果產(chǎn)生了重復的key,將會拋出異常。
java8也提供了轉(zhuǎn)換的方法,這里直接照搬別人博客的代碼:
@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()); }
相關(guān)文章
springMVC在restful風格的性能優(yōu)化方案
這篇文章主要介紹了springMVC在restful風格的性能優(yōu)化方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08Java?CompletableFuture實現(xiàn)原理分析詳解
CompletableFuture是Java8并發(fā)新特性,本文我們主要來聊一聊CompletableFuture的回調(diào)功能以及異步工作原理是如何實現(xiàn)的,需要的可以了解一下2022-09-09JAVA?從完整的文件路徑中分別截取文件名和文件路徑的實現(xiàn)
在Java編程中,經(jīng)常會遇到需要截取文件名的場景,本文主要介紹了JAVA?從完整的文件路徑中分別截取文件名和文件路徑的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-04-04如何在Intellij中安裝LeetCode刷題插件方便Java刷題
這篇文章主要介紹了如何在Intellij中安裝LeetCode刷題插件方便Java刷題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08Java Chassis3過載狀態(tài)下的快速失敗解決分析
本文解密了Java Chassis 3快速失敗相關(guān)的機制和背后故事,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01