2016-05-05 10 views
1

Ich habe eine iterable von einer Klasse: Iterable<ClassA> classAIterable. Ich habe eine zweite Klasse wie folgt aus:Wie nehme ich eine Iterable von einer Klasse und verwandle sie in eine Iterable einer anderen Klasse?

public class ClassB { 
    private final ClassA classA; 
    public ClassB(ClassA a) { 
     this.classA = a; 
    } 
} 

ich jedes ClassA Objekt in classAIterable nehmen möchten und machen es zu einem ClassB Objekt, das eine ClassA Objekt enthält und steckte sie in eine iterable von ClassB.

Wie würde ich das tun? Vielen Dank!

Antwort

1

Sie können Ihre Iterable in eine Stream konvertieren, indem Sie auf Spliterator zugreifen, indem Sie StreamSupport.stream verwenden. Im Stream können Sie die Elemente von ClassA bis ClassB abbilden und dann in eine List, die Iterable ist, sammeln.

Iterable<ClassB> iterB = StreamSupport.stream(iterable.spliterator(), false) 
    .map(ClassB::new) 
    .collect(Collectors.toList()); 
+0

arbeiten Wenn mein 'ClassB' Konstruktor mehr Argumente übernimmt, wie gehe ich die in? –

+0

Sie können einen Lambda-Ausdruck anstelle der Konstruktorreferenz verwenden, z. 'a -> neuer ClassB (a, andere, args)'. – rgettman

+0

Großartig, das funktioniert, danke! –

0

Natürlich ist es vielleicht nicht in Ihrem Fall geeignet sein, aber als eine Variante der Lösung:

1) U schaffen Schnittstelle:

interface interfaceC { 
    } 

2) Und es in beiden implementieren ClassA und ClassB:

class ClassA implements interfaceC {   
    } 

class ClassB implements interfaceC {   
    } 

3) und dann iterable vonverwenden

class classIterable implements Iterable<interfaceC> { 
     private List<interfaceC> internalList = null; 
    } 

Könnte für u

Verwandte Themen