如何在Java中将两个数组映射到一个HashMap?

我有两个String数组。 一个人的名字很短。

// days short name String[] shortNames = {"SUN", "MON", "...", "SAT"}; 

另一个有很长的名字。

 // days long name String[] longNames = {"SUNDAY", "MONDAY", "....", "SATURDAY"}; 

两者都具有相同数量的元素。 如何在HashMap中将短名称映射为KEY,将长名称映射为VALUE?

 HashMap days = new HashMap(); 

我知道,我可以通过循环来制作。 有没有更好的办法?

有很多方法可以做到这一点。 一个相当容易理解和应用的方法是使用Java 8流和收集器从索引流映射到键值对:

 Map days = IntStream.range(0, shortNames.length).boxed() .collect(Collectors.toMap(i -> shortNames[i], i -> longNames[i])); 

有一些第三方Java库包含一个’zip’函数来获取两个流并生成一个映射到另一个。 但实际上它们只是实现与上述代码相同的更简洁的方式。

接受的答案对我不起作用,因为IntStream不提供单参数collect方法。

尽管如此,要从toMap收集器中获益,您必须首先将int基元toMapInteger对象中。 如果您想保留元素顺序,请将扩展版本的toMapLinkedHashMap::new一起使用,如下所示:

 package learning.java8; import static java.util.stream.Collectors.*; import static org.junit.Assert.*; import java.time.DayOfWeek; import java.time.format.TextStyle; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.Locale; import java.util.Map; import java.util.stream.IntStream; import org.junit.Test; public class IntStreamLT { @Test public void q30339679() { final String[] shortNames = getDayOfWeekNamesInEnglish(TextStyle.SHORT); final String[] longNames = getDayOfWeekNamesInEnglish(TextStyle.FULL); final Map days = IntStream.range(0, shortNames.length).boxed() .collect(toMap(i -> shortNames[i], i -> longNames[i])); System.out.println(days); final Map sorted = IntStream.range(0, shortNames.length).boxed() .collect(toMap( i -> shortNames[i], i -> longNames[i], (i, j) -> i, LinkedHashMap::new)); System.out.println(sorted); assertEquals("{Mon=Monday, Tue=Tuesday, Wed=Wednesday, Thu=Thursday, " + "Fri=Friday, Sat=Saturday, Sun=Sunday}", sorted.toString()); } private static String[] getDayOfWeekNamesInEnglish(final TextStyle style) { return Arrays.stream(DayOfWeek.values()) .map(day -> day.getDisplayName(style, Locale.ENGLISH)) .toArray(String[]::new); } } 

另见: 为什么原始Stream没有收集(collections家)?

您可以使用org.apache.commons.lang3.ArrayUtils

这是一个例子:

 Map colorMap = ArrayUtils.toMap(new String[][] { {"RED", "#FF0000"}, {"GREEN", "#00FF00"}, {"BLUE", "#0000FF"}});