【发布时间】:2016-04-13 17:17:51
【问题描述】:
我正在处理 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) {
}
}
在我的第二种方法中,我尝试使用地图和平面地图的操作:
@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());
}
问题是我无法访问地图操作中的派对对象。 所以问题又是我能以更实用的方式做吗? (和第二种方法一样)
谢谢!
【问题讨论】:
-
是的,hack 是将平面映射成一个元组流,其中包含成员及其派对。像
.flatMap(party -> party.getMembers().stream().map(member -> new Tuple<>(party, member))这样的东西。而且由于没有内置的元组类,您可以自己制作或(ab)使用AbstractMap.SimpleEntry... -
或者
Pair.of(party, member)来自 commons-lang 如果你已经有这个依赖。 -
@Tunaki:你想的太复杂了……
标签: java functional-programming java-8 java-stream