首页 > 解决方案 > 在Java中将包装的流转换为另一个流

问题描述

我需要将另一个流中的包装流转换为映射。

public Map<String, MyObject> convert(Stream<Stream<MyObject>> myobjects) {
    Map<String, MyObject> processedTransactionMap = new HashMap<String, MyObject>();
    // convert process..  key of map is any String variable  of MyObject
    return processedTransactionMap;
}

谢谢你。

标签: javajava-stream

解决方案


由于多个MyObject可能具有相同的String键,您应该解释您如何需要聚合数据。

无论如何,有两种主要方法可以做到这一点;一个完整的例子可能是:

public static void main(String... args) throws IOException {

    // aggregate all with same key
    Map<String, List<MyObject>> agg1 = makeExample()
            .flatMap(x -> x)        // stream of stream to one single stream
            .collect(groupingBy(    // group by
                    x -> x.key,     //      key
                    toList()));     //      if collision, aggregate to a list

    // aggregate with collision
    Map<String, MyObject> agg2 = makeExample()
            .flatMap(x -> x)
            .collect(toMap(                     // aggregate to single MyOject
                    x -> x.key,                 // grouping by key
                    x -> x,                     // taking MyObject
                    (a, b) -> new MyObject(     // if collision form a new one
                            a.key,              //      with that key
                            a.data + b.data))); //      addind data

    // print results
    System.out.println("== as list ==");
    agg1.forEach((key, ys) -> {
        System.out.printf("  ** %s%n", key);
        ys.forEach(y -> System.out.printf("    %s%n", y));
    });

    System.out.println();

    System.out.println("== joining ==");
    agg2.forEach((key, y) -> {
        System.out.printf("  ** %s%n", key);
        System.out.printf("    %s%n", y);
    });
}

static Stream<Stream<MyObject>> makeExample() {
    return IntStream.range(1, 3)
            .mapToObj(n -> IntStream.range(1, n + 1)
                    .mapToObj(j -> new MyObject(Integer.toString(n), j)));
}

static class MyObject {
    public String key;
    public int data;

    public MyObject(String key, int data) {
        this.key = key;
        this.data = data;
    }

    public String toString() {
        return String.format("{key: %s, data: %d}", key, data);
    }
}

带输出

== as list ==
  ** 1
    {key: 1, data: 1}
  ** 2
    {key: 2, data: 1}
    {key: 2, data: 2}

== joining ==
  ** 1
    {key: 1, data: 1}
  ** 2
    {key: 2, data: 3}

推荐阅读