Fed*_*rez 5 java functional-programming java-8 java-stream
我正在处理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) {
}
}
Run Code Online (Sandbox Code Playgroud)
在我的第二种方法中,我尝试使用地图平面图的操作:
@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());
}
Run Code Online (Sandbox Code Playgroud)
问题是我无法访问map操作中的party对象.所以问题是我能以更实用的方式做吗?(像第二种方法)
谢谢!
你将过多的分解成了单独的操作:
List<Elector> people = listOfParties.stream()
.flatMap(party -> party.getMembers().stream()
.map(membersName -> new Elector(membersName, party.name)))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
这可以通过将两个map步骤移动到flatMap步骤中,其中只有第二个步骤存活,现在应用于返回的"子流".正如你的问题的评论所指出的,你需要某种Pair类型来映射"子流"元素,但是你的Elector类型完全符合它,因为它是使用你感兴趣的两个值构造的.所以没有必要映射到通用Pair(member,party)只是为了映射到Elector之后.