Java8类型推断错误
我尝试使用Java8流来概括我的映射转置方法。这是密码Java8类型推断错误,java,java-8,java-stream,Java,Java 8,Java Stream,我尝试使用Java8流来概括我的映射转置方法。这是密码 public static <K, V> Map<V, Collection<K>> trans(Map<K, Collection<V>> map, Function<? super K, ? extends V> f,
public static <K, V> Map<V, Collection<K>> trans(Map<K, Collection<V>> map,
Function<? super K, ? extends V> f,
Function<? super V, ? extends K> g) {
return map.entrySet()
.stream()
.flatMap(e -> e.getValue()
.stream()
.map(l -> {
V iK = f.apply(e.getKey());
K iV = g.apply(l);
return Tuple2.of(iK, iV);
}))
.collect(groupingBy(Tuple2::getT2, mapping(Tuple2::getT1, toCollection(LinkedList::new))));
}
public class Tuple2<T1, T2> {
private final T1 t1;
private final T2 t2;
public static <T1, T2> Tuple2<T1, T2> of(T1 t1, T2 t2) {
return new Tuple2<>(t1, t2);
}
// constructor and getters omitted
}
要让它工作,我必须做什么更改?问题是,实际上您将值作为键进行转换,反之亦然,以原始输入为准,但由于您应用的函数保留了与原始映射中相同的键值类型,因此在flatmap操作后,您将得到一个
流
,因此collect再次返回映射
因此,方法头应该是:
public static <K, V> Map<K, Collection<V>> trans(Map<K, Collection<V>> map,
Function<? super K, ? extends V> f,
Function<? super V, ? extends K> g)
公共静态地图传输(地图、,
函数谢谢。我刚刚发现我不需要交换两次键/值,因为映射程序已经交换了。
public static <K, V> Map<K, Collection<V>> trans(Map<K, Collection<V>> map,
Function<? super K, ? extends V> f,
Function<? super V, ? extends K> g)