java流式传输对象
在本文中,我将向您展示如何在标准Java映射上有效地实现Speedment Open Source流,并将Stream接口扩展为MapStream! 即使在复杂的情况下,此添加将使保持流的具体性和可读性变得更加容易。 希望这将允许您继续流式传输而不会过早收集结果。
Java 8最大的功能之一就是能够流式处理对象集合。 通过将.stream()方法添加到Collection接口中,使用此新功能突然扩展了Java语言中的每个集合。 其他数据结构(例如Map-interface)由于不是严格意义上的集合,因此未实现该方法。
MapStream将使用两个类型参数,一个键和一个值。 通过指定Map.Entry <K,V>作为类型参数,它还将扩展标准Stream接口。 这将允许我们直接从任何Java映射构造MapStream。
public interface MapStream<K, V> extends Stream<Map.Entry<K, V>> {...
}
多态性的概念告诉我们,只要新的返回类型是旧的返回类型的更具体的实现,子组件可能会更改覆盖方法的返回类型。 我们将在定义MapStream接口时使用它,以便对于每个链接操作,都返回一个MapStream而不是Stream。
public interface MapStream<K, V> extends Stream<Map.Entry<K, V>> {@Override MapStream<K, V> filter(Predicate<? super Map.Entry<K, V>> predicate);@Override MapStream<K, V> distinct();@OverrideMapStream<K, V> sorted(Comparator<? super Map.Entry<K, V>> comparator);...
}
某些操作仍将需要返回普通Stream。 如果操作更改了流元素的类型,我们将无法确保新类型将是Map.Entry。 但是,我们可以添加其他方法以在具有键-值对的类型之间进行映射。
@Override<R> Stream<R> map(Function<? super Map.Entry<K, V>, ? extends R> mapper);<R> Stream<R> map(BiFunction<? super K, ? super V, ? extends R> mapper);
除了可以使用户从条目映射到其他功能的功能外,他(她)还可以从键值对映射到其他功能。 当然,这很方便,但是由于我们正在使用值对,因此我们还可以添加更多特定的映射操作。
<R> MapStream<R, V> mapKey(BiFunction<? super K, ? super V, ? extends R> mapper);<R> MapStream<K, R> mapValue(BiFunction<? super K, ? super V, ? extends R> mapper);
看起来差别不大,但是使用API时,差别显而易见:
// With MapsStream
final Map<String, List<Long>> map = ...;
MapStream.of(map).mapKey((k, v) -> k + " (" + v.size() + ")").flatMapValue((k, v) -> v.stream()).map((k, v) -> k + " >> " + v).collect(System.out::println);// Without MapStream
final Map<String, List<Long>> map = ...;
map.entrySet().stream().map(e -> new AbstractMap.SimpleEntry<>(e.getKey() + " (" + e.getValue().size() + ")"),e.getValue())).flatMap(e -> e.getValue().stream().map(v -> new AbstractMap.SimpleEntry<>(e.getKey(), v))).map(e -> e.getKey() + " >> " + e.getValue()).collect(System.out::println);
- 可以在此处找到 MapStream的完整实现。 如果您对更酷的东西感兴趣,请查看Speedment Github页面 。 玩得开心!
翻译自: https://www.javacodegeeks.com/2016/02/streaming-maps-java-8.html
java流式传输对象