Java Collectors toMap()方法在Java中的应用实例
toMap() 方法是 收集器 类的一个静态方法,它返回一个收集器,该收集器将元素累积到一个Map中,其键和值是对输入元素应用所提供的映射函数的结果。请注意,键是唯一的,如果在任何情况下键是重复的,那么在执行收集操作时就会抛出一个IllegalStateException。
toMap()方法有3个重载。
toMap(Function keyMapper, Function valueMapper)
语法。
public static Collector<T, ?, Map>
toMap(Function keyMapper, Function valueMapper)
其中
- T : 输入元素的类型。
- Map : 输出地图。
- 接口收集器: 一个可变的还原操作,将输入元素累积到一个可变的结果容器中,在所有输入元素被处理后,可选择将累积的结果转化为最终表示。还原操作可以按顺序进行,也可以并行进行。
- toMap() : 收集器类的静态方法,并返回一个收集器,该收集器将元素收集到一个Map中,其键和值是对输入元素应用映射函数的结果。采集器类在java.util.streams包下。
参数。这个方法接受以下参数。
- keyMapper : 一个产生键的映射函数
- valueMapper :产生值的映射函数。
返回值。该方法返回一个收集器,该收集器将元素收集到一个Map中,其键和值是对输入元素应用映射函数的结果。
下面的例子说明了上述方法。
// Java program to demonstrate
// toMap() method with unique keys
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.*;
public class GFG {
public static void main(String[] args)
{
// Create a String with no repeated keys
Stream<String[]>
str = Stream
.of(new String[][] { { "GFG", "GeeksForGeeks" },
{ "g", "geeks" },
{ "G", "Geeks" } });
// Convert the String to Map
// using toMap() method
Map<String, String>
map = str.collect(
Collectors.toMap(p -> p[0], p -> p[1]));
// Print the returned Map
System.out.println("Map:" + map);
}
}
输出:
Map:{G=Geeks, g=geeks, GFG=GeeksForGeeks}
toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction)
这是对 toMap() 方法的重载,其中在键和值中加入了一个额外的参数,那就是 合并函数。 该函数的任务是以编码者定义的方式合并具有相同键的值。这种重载方法只推荐在多个值有相同键的情况下使用。下面是一个简单的例子。
语法。
public static Collector<T, ?, Map>
toMap(Function keyMapper,
Function valueMapper,
BinaryOperator<U> mergeFunction)
其中
- T : 输入元素的类型。
- Map : 输出地图。
- 接口收集器: 一个可变的还原操作,将输入元素累积到一个可变的结果容器中,在所有输入元素被处理后,可选择将累积的结果转化为最终表示。还原操作可以按顺序进行,也可以并行进行。
- toMap() : 收集器类的静态方法,并返回一个收集器,该收集器将元素收集到一个Map中,其键和值是对输入元素应用映射函数的结果。采集器类在java.util.streams包下。
参数。这个方法接受以下参数。
- keyMapper : 一个产生键的映射函数
- valueMapper :一个产生值的映射函数
- mergeFunction :一个合并函数,用于解决与同一键相关的值之间的冲突,如提供给Map.merge(Object, Object, BiFunction)的。
返回值。该方法返回一个收集器,该收集器将元素收集到一个Map中,其键是对输入元素应用键映射函数的结果,其值是对所有等于键的输入元素应用值映射函数的结果,并使用merge函数将它们结合起来。
下面的例子说明了上述方法。
// Java program to demonstrate
// toMap() method without unique keys
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.*;
public class GFG {
public static void main(String[] args)
{
// Create a String with repeated keys
Stream<String[]>
str = Stream
.of(new String[][] { { "GFG", "GeeksForGeeks" },
{ "g", "geeks" },
{ "GFG", "geeksforgeeks" } });
// Get Map from String
// using toMap() method
Map<String, String>
map = str
.collect(Collectors
.toMap(p -> p[0], p -> p[1], (s, a) -> s + ", " + a));
// Print the Map
System.out.println("Map:" + map);
}
}
输出:
Map:{g=geeks, GFG=GeeksForGeeks, geeksforgeeks}
toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction, Supplier mapSupplier)
这是一个 toMap() 的重载方法,增加了一个参数,即供应商。我们需要在这里传递供应商。Supplier是java.util.Function类的接口。这是一个功能接口,因此可以作为lambda表达式或方法引用的赋值目标。如果我们想返回LinkedHashMap,我们需要将supplier传递为LinkedHashMap::new。在下面的例子中,我们也将这样做。
语法。
public static <T, K, U, M extends Map> Collector
toMap(Function keyMapper,
Function valueMapper,
BinaryOperator<U> mergeFunction,
Supplier mapSupplier)
其中
- T : 输入元素的类型。
- Map : 输出地图。
- 接口收集器: 一个可变的还原操作,将输入元素累积到一个可变的结果容器中,在所有输入元素被处理后,可选择将累积的结果转化为最终表示。还原操作可以按顺序进行,也可以并行进行。
- toMap() : 收集器类的静态方法,并返回一个收集器,该收集器将元素收集到一个Map中,其键和值是对输入元素应用映射函数的结果。采集器类在java.util.streams包下。
参数。这个方法接受以下参数。
- keyMapper : 一个产生键的映射函数
- valueMapper :一个产生值的映射函数
- mergeFunction :一个合并函数,用于解决与同一键相关的值之间的冲突,如提供给Map.merge(Object, Object, BiFunction)的。
- mapSupplier : 一个函数,它返回一个新的、空的Map,结果将被插入其中。
返回值。该方法返回一个收集器,该收集器将元素收集到一个Map中,其键是对输入元素应用键映射函数的结果,其值是对所有等于键的输入元素应用值映射函数的结果,并使用merge函数将它们组合起来
下面的例子说明了上述方法。
// Java program to demonstrate
// toMap() method
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.*;
public class GFG {
public static void main(String[] args)
{
// Create a String to be converted
Stream<String[]>
Ss1 = Stream
.of(new String[][] { { "GFG", "GeeksForGeeks" },
{ "g", "geeks" },
{ "GFG", "Geeks" } });
// Get Map from String
// using toMap() method
LinkedHashMap<String, String>
map2 = Ss1
.collect(Collectors
.toMap(
p -> p[0], p -> p[1], (s, a) -> s + ", " + a, LinkedHashMap::new));
// Print the Map
System.out.println("Map:" + map2);
}
}
输出:
Map:{GFG=GeeksForGeeks, Geeks, g=geeks}