2017-07-05 81 views
0

我有两个流,一个包含A的对象,一个包含B的对象,它们的长度相同。现在我有一个名为C的类,它包含A和B作为它的字段。如何使用流合并两个流?

class C { 
    A a; 
    B b; 
} 

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

+0

拉姆达联合:http://www.programcreek.com/2014/01/concat-streams-in- java-8/ – duffymo

+0

@duffymo OP不问concat,我想这是关于压缩流。 –

回答

0

如果您在类路径中有番石榴,看看在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; 
} 
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]