我正在处理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());

}

问题是我无法访问map操作中的party对象。
所以问题又来了,我能以一种更实用的方式来做吗? (类似于第二种方法)

谢谢!

最佳答案

您过多地分解为单个操作:

List<Elector> people = listOfParties.stream()
    .flatMap(party -> party.getMembers().stream()
        .map(membersName -> new Elector(membersName, party.name)))
    .collect(Collectors.toList());

通过将map的两个步骤都移到flatMap的步骤来工作,只有第二个步骤幸存,现在将其应用于返回的“子流”。正如您的问题注释中所指出的那样,您需要某种Pair类型来将“子流”元素映射到,但是您的Elector类型正是通过使用您感兴趣的两个值构造的,从而完全满足了这一要求。无需映射到通用的Pair(member,party),仅需随后映射到Elector

08-04 17:03