Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8 从地图创建多重地图<;K、 收藏<;V>&燃气轮机;使用Java 8,键为V[0],值为K_Java 8_Guava - Fatal编程技术网

Java 8 从地图创建多重地图<;K、 收藏<;V>&燃气轮机;使用Java 8,键为V[0],值为K

Java 8 从地图创建多重地图<;K、 收藏<;V>&燃气轮机;使用Java 8,键为V[0],值为K,java-8,guava,Java 8,Guava,我有一个映射(比如说inputMap),我想把它转换成另一个映射,其中新映射中的每个(k,v)都是inputMap的(v.get(0),k) 前 到 我最初认为我可以用类似 inputMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue.get(0),Map.Entry::getKey)); 然后将此映射转换为多重映射,但我无法编写map.Entry::getValue.get(0) 如果我能在.collect

我有一个
映射
(比如说inputMap),我想把它转换成另一个
映射
,其中新映射中的每个(k,v)都是inputMap的(v.get(0),k)

我最初认为我可以用类似

inputMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue.get(0),Map.Entry::getKey));
然后将此映射转换为多重映射,但我无法编写
map.Entry::getValue.get(0)


如果我能在
.collect()
本身中创建多重映射,那也太好了。

这里有一种方法:

Map<String, List<String>> output = input.entrySet().stream()
        //create new entries mapping B to X, B to Y, B to Z etc.
        .map(e -> new SimpleEntry<>(e.getValue().get(0), e.getKey()))
        //we group by the key (B or A) and we collect the values into a list
        .collect(groupingBy(Entry::getKey, mapping(Entry::getValue, toList())));
Map output=input.entrySet().stream()
//创建映射B到X、B到Y、B到Z等的新条目。
.map(e->new SimpleEntry(e.getValue().get(0),e.getKey())
//我们按键(B或A)分组,并将值收集到一个列表中
.collect(groupingBy(Entry::getKey,mapping(Entry::getValue,toList()));

方法引用不是这样工作的。如果不能将函数表示为对单个方法的引用,则需要lambda表达式

此外,当您需要多个值时,
toMap
收集器不是最佳选择,
groupingBy
是正确的工具

Map<String,List<String>> result=map.entrySet().stream().collect(
    Collectors.groupingBy(e->e.getValue().get(0),
        Collectors.mapping(Map.Entry::getKey, Collectors.toList())));
Map result=Map.entrySet().stream().collect(
Collectors.groupby(e->e.getValue().get(0),
Collectors.mapping(Map.Entry::getKey,Collectors.toList());

您可以直接收集到一个
多地图中

Multimap<String, String> result = inputMap.entrySet().stream()
        .collect(
                ArrayListMultimap::create,
                (mm,e) -> mm.put(e.getValue().get(0), e.getKey()),
                Multimap::putAll
        );
Multimap result=inputMap.entrySet().stream()
.收集(
ArrayListMultimap::创建,
(mm,e)->mm.put(e.getValue().get(0),e.getKey()),
多重映射::putAll
);

这是可行的,但我认为与使用普通for循环相比,这有点过于冗长。也许现在还不是对Java8函数编程发狂的时候……这更接近于我想要的,非常感谢
Map<String,List<String>> result=map.entrySet().stream().collect(
    Collectors.groupingBy(e->e.getValue().get(0),
        Collectors.mapping(Map.Entry::getKey, Collectors.toList())));
Multimap<String, String> result = inputMap.entrySet().stream()
        .collect(
                ArrayListMultimap::create,
                (mm,e) -> mm.put(e.getValue().get(0), e.getKey()),
                Multimap::putAll
        );