Я имею дело с потоками Java 8, и мне интересно, могу ли я решить эту проблему по-настоящему.Передача объектов через потоки и карты с картами
Это мой сценарий: Предположим, у меня есть список сторон, и внутри каждого элемента у меня есть имена членов. Я хочу перебирать список и создавать новый с именами и кем они принадлежат.
Мой первый подход:
@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) {
}
}
На втором подходе я пытался использовать карты операции, которые flatmap в:
@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());
}
Проблема в том, что я не могу получить доступ к объекту партии внутри операции с картами. Итак, вопрос снова: могу ли я сделать более функциональный способ? (например, второй подход)
Спасибо!
Да, взлом - это плоская карта в поток кортежа, в который будет входить член и его сторона. Что-то вроде '.flatMap (party -> party.getMembers(). Stream(). Map (member -> new Tuple <> (party, member)). И поскольку нет встроенного кортежа, вы можете сделать ваш собственный или (ab) использовать 'AbstractMap.SimpleEntry' ... – Tunaki
Или' Pair.of (party, member) 'из commons-lang, если у вас уже есть эта зависимость. –
@Tunaki: вы думаете слишком сложно ... – Holger