1

我有两节课

public class User {
    private int _Id;
    private String _FirstName;
    private String _LastName;}

public class Card {
    private int _Id;
    private int _UserId;
    private String _Serial;}

我有User[]和的数组Card[]。我想创建 来自 Cards 的HashMap<String, User>位置User._Id == Card._UserId和字符串(在 HashMap 中)_Serial......我想我可以使用 lambdaj 但我不知道如何......

4

1 回答 1

0

不幸的是,我不知道 lambdaj,所以我无法提供使用 lambdaj 的解决方案。但我认为使用纯 Java 分两步可以相当优雅且有效地解决问题。

  • 第一步将 User._Id 映射到 User
  • 第二步使用第一个Map将Card._Serial映射到User

我没有测试代码,但我非常乐观地认为它可以工作 ;-)

因为我不喜欢数组,所以我使用用户列表和卡片作为输入。

希望这可以帮助!

public class CardToUserMapper {

public Map<String, User> mapCardsToUser(
        final List<User> users,
        final List<Card> cards) {

    Map<Integer, User> idToUser = 
            users.stream()
            .collect(Collectors.toMap(
                    u -> u.getId(), 
                    u -> u));

    Map<String, User> serialToUser = 
            cards.stream()
            .collect(Collectors.toMap(
                    c -> c.getSerial(),
                    c -> idToUser.get(c.getUserId())));

    return serialToUser;
}

}

如果有人喜欢它更简洁,可以这样做:

public class CardToUserMapper {

public Map<String, User> mapCardsToUser(final List<User> users,
        final List<Card> cards) {

    return mapSerialToUser(cards, mapUserIdToUser(users));
}

private Map<String, User> mapSerialToUser(final List<Card> cards,
        final Map<Integer, User> idToUser) {

    return map(cards, c -> c.getSerial(), c -> idToUser.get(c.getUserId()));

}

private Map<Integer, User> mapUserIdToUser(final List<User> users) {

    return map(users, u -> u.getId(), u -> u);
}

private <S, T, U> Map<T, U> map(final List<S> listOfS, final Function<S, T> funcStoT,
        final Function<S, U> funcStoU) {

    return listOfS.stream().collect(Collectors.toMap(funcStoT, funcStoU));

}

}

于 2016-07-07T16:23:55.983 回答