使用Java 8在地图上流式传输

使用Java 8在地图上流式传输_第1张图片 在本文中,我将向您展示如何在标准Java映射上有效地实现Speedment Open Source流,并将Stream接口扩展为MapStream! 即使在复杂的情况下,此添加将使保持流的具体性和可读性变得更加容易。 希望这将允许您继续流式传输而不会过早收集结果。

Java 8中最大的功能之一就是能够流化对象集合。 通过将.stream()方法添加到Collection接口中,使用此新功能突然扩展了Java语言中的每个集合。 其他数据结构(例如Map-interface)不会实现该方法,因为它们并不是严格意义上的集合。

MapStream将使用两个类型参数,一个键和一个值。 通过指定Map.Entry 作为类型参数,它还将扩展标准Stream接口。 这将允许我们直接从任何Java映射构造MapStream。

public interface MapStream extends Stream> {
    ...
}

多态性的概念告诉我们,只要新的返回类型是旧的返回类型的更具体的实现,子组件就可以更改覆盖方法的返回类型。 我们将在定义MapStream接口时使用它,以便对于每个链接操作,都返回MapStream而不是Stream。

public interface MapStream extends Stream> {

    @Override 
    MapStream filter(Predicate> predicate);

    @Override 
    MapStream distinct();

    @Override
    MapStream sorted(Comparator> comparator);

    ...
}

某些操作仍将需要返回普通Stream。 如果操作更改了流元素的类型,则我们无法确保新类型将是Map.Entry。 但是,我们可以添加其他方法以在具有键-值对的类型之间进行映射。

@Override
     Stream map(Function, ? extends R> mapper);
    
     Stream map(BiFunction mapper);

除了允许用户从条目映射到其他内容的功能外,他(她)还可以从键值对映射到其他内容。 当然,这很方便,但是由于我们正在使用值对,因此我们还可以添加更多特定的映射操作。

 MapStream mapKey(BiFunction mapper);

     MapStream mapValue(BiFunction mapper);

看起来差别不大,但是使用API​​时,差别显而易见:

// With MapsStream
final Map> 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> 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 8在地图上流式传输)