Ich habe es mit Java 8 Streams zu tun, und ich frage mich, ob ich dieses Problem auf eine raffinierte Weise lösen könnte.Übergeben von Objekten durch Streams und Flatmaps
Das ist mein Szenario: Angenommen, ich habe eine Liste von Parteien und in jedem Element habe ich die Namen der Mitglieder. Ich möchte über die Liste iterieren und eine neue mit den Namen und der Partei erstellen, zu der sie gehören.
Mein erster Ansatz war:
@Test
public void test(){
Party firstParties = new Party("firstParty",Lists.newArrayList("Member 1","Member 2","Member 3"));
Party secondParty = new Party("secondParty",Lists.newArrayList("Member 4","Member 5","Member 6"));
List<Party> listOfParties = Lists.newArrayList();
listOfParties.add(firstParty);
listOfParties.add(secondParty);
List<Elector> electors = new ArrayList<>();
listOfParties.stream().forEach(party ->
party.getMembers().forEach(memberName ->
electors.add(new Elector(memberName,party.name))
)
);
}
class Party {
List<String> members = Lists.newArrayList();
String name = "";
public Party(String name, List<String> members) {
this.members = members;
this.name = name;
}
public List<String> getMembers() {
return members;
}
}
class Elector{
public Elector(String electorName,String partyName) {
}
}
In meinem zweiten Ansatz, den ich versuchte, ein flatmap Operationen zu verwenden Karten:
@Test
public void test(){
Party firstParty = new Party("firstParty",Lists.newArrayList("Member 1","Member 2","Member 3"));
Party secondParty = new Party("secondParty",Lists.newArrayList("Member 4","Member 5","Member 6"));
List<Party> listOfParties = Lists.newArrayList();
listOfParties.add(firstParty);
listOfParties.add(secondParty);
List<Elector> people = listOfParties.stream().map(party -> party.getMembers())
.flatMap(members -> members.stream())
.map(membersName -> new Elector(membersName, party.name)) #Here is my problem variable map doesn't exist
.collect(Collectors.toList());
}
Das Problem ist, ich nicht auf das Party-Objekt in dem Zugriff auf Kartenoperation. Die Frage ist also wieder Kann ich es auf eine funktionellere Weise tun? (wie der zweite Ansatz)
Vielen Dank!
Ja, der Hack soll in einen Stream von Tupel flammap, die das Mitglied und seine Partei enthalten würde. Etwas wie '.flatMap (party -> party.getMembers(). Stream(). Map (Mitglied -> neues Tupel <> (Partei, Mitglied))'. Und da es keine eingebaute Tuple-Klasse gibt, können Sie machen eigene oder (ab) verwenden 'AbstractMap.SimpleEntry' ... – Tunaki
Oder' Pair.of (Partei, Mitglied) 'aus commons-lang, wenn Sie bereits diese Abhängigkeit haben. –
@Tunaki: Sie denken zu kompliziert ... – Holger