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}
极客教程