如何使用流合并两个流?

时间:2017-07-05 01:19:32

标签: java

我有两个流,一个包含A的对象,一个包含B的对象,它们的长度相同。现在我有一个名为C的类,它包含A和B作为其字段。

class C {
    A a;
    B b;
}

如何使用流操作将两个流合并为一个流?

2 个答案:

答案 0 :(得分:0)

如果您的类路径中有Guava,请查看Streams.zip实用程序:

Stream<C> streamC = Streams.zip(streamA, streamB, C::new);

这假定C有一个接受AB的构造函数:

public C(A a, B b) {
    this.a = a;
    this.b = b;
}

答案 1 :(得分:0)

试试这个:

public class ZipTest{

    static A[] arrayA;
    static B[] arrayB;
    public static void main(String[] args) {

        //more convenient to zip arrays. if you start with streams
        //collect to arrays : arrayA = streamA.toArray();

        arrayA = new A[] {new A("a1"), new A("a2"), new A("a3")};
        arrayB = new B[] {new B("b1"), new B("b2"), new B("b3")};

        Stream<Object> zippedA_B = IntStream.range(0, 2* Math.min(arrayA.length, arrayB.length))
        .mapToObj( i ->  getElement(i) );

        System.out.println(Arrays.toString(zippedA_B.toArray()));
    }

    private static Object getElement(int i) {

        return ((i%2) == 0) ? arrayA[i/2] : arrayB[i/2];
    }
}

class A{
    String name;
    A(String name){ this.name = name;}
    @Override
    public String toString() {return name;}
}

class B{
    String name;
    B(String name){ this.name = name;}
    @Override
    public String toString() {return name;}
}

输出:

  

[a1,b1,a2,b2,a3,b3]