在我看来,Holger在评论部分给出了最佳答案:
这是Java 8类型推断的一个已知限制:它不适用于链式方法调用
genericFactoryMethod().build()。
谢谢!关于我的API,我将在使用函数作为参数之前指定它们,如下所示:
Function<Entry<String, Set<String>>, String> keyMapper = Entry::getKey;Function<Entry<String, Set<String>>, Stream<String>> valueMapper = entry -> entry.getValue().stream();
编辑:由于霍尔格的评论,我重新设计了API(再次感谢!)。它保留原始元素而不是键,以及展平的值。
public static <T, R> Function<? super T, Stream<FlatEntry<T, R>>> flatEntryMapper(Function<? super T, ? extends Stream<? extends R>> mapper){ return element -> mapper.apply(element).map(value -> new FlatEntry<>(element, value));}public static class FlatEntry<E, V>{ public final E element; public final V value; private FlatEntry (E element, V value) { this.element = element; this.value = value; }}它是可链接的,从2级开始,映射器必须处理a
FlatEntry。用法类似于简单的用法
flatMap:
Map<String, Map<String, Map<String, Set<String>>>> level3Map;// gives a stream of all the flattened valueslevel3Map.entrySet() .stream() .flatMap(entry -> entry.getValue().entrySet().stream()) .flatMap(entry -> entry.getValue().entrySet().stream()) .flatMap(entry -> entry.getValue().stream());// gives a stream of FlatEntries with flattened values and all their original elements in nested FlatEntrieslevel3Map.entrySet() .stream() .flatMap(GdkStreams.flatEntryMapper(entry -> entry.getValue().entrySet().stream())) .flatMap(GdkStreams.flatEntryMapper(flatEntry -> flatEntry.value.getValue().entrySet().stream())) .flatMap(GdkStreams.flatEntryMapper(flatEntry -> flatEntry.value.getValue().stream()));



