Java 8流组合了两个不同的集合

时间:2016-07-01 12:31:15

标签: java java-stream

我还是java 8流的新手,所以我正在弄清楚如何尽可能地做到这一点。

我想知道是否有更简单的解决方案来组合两个不同对象的流。

假设我有以下java对象。

public class Message {

    private String id;
    private String key;
    private List<MessageLocalization> localizations = new ArrayList<>();

    // ...getters setters
}

public class MessageLocalization {

    private String id;
    private String language;
    private String baseText;
    private String shortText;
    private String longText;
    private Integer orderBy = 1;

    // ...getters setters
}

并使用以下方法我正在检索所有带有本地化的消息。

public List<Message> getAllMessages() {
        List<Message> messages =
                StreamSupport
                        .stream(messageRepository.findAll().spliterator(), false)
                        .map(message -> new Message(message.getId(), message.getMessageKey()))
                        .collect(Collectors.toList());

        messages
                .stream()
                .forEach(message -> {
                    localizationRepository.findAllByObjectIdAndLocalizedType(message.getId(), LocalizedType.MESSAGE)
                            .stream()
                            .forEach(localization -> {
                                message.getLocalizations().add(
                                        new MessageLocalization(localization.getId(),
                                                localization.getLanguage(),
                                                localization.getBaseText(),
                                                localization.getShortText(),
                                                localization.getLongText(),
                                                localization.getOrderBy()));
                            });
                });
}

所以我在这里有两个步骤:

  1. 从存储库中检索数据并构建Message列表
  2. 流式传输Message列表并从其他存储库中检索其本地化的数据
  3. 这可以更简单地重写(例如包括第一步中的第二步)吗?

    由于

2 个答案:

答案 0 :(得分:1)

考虑将localizations列表初始化为Message对象初始化的一部分:

public List<Message> getAllMessages() {
    return StreamSupport.stream(messageRepository.findAll().spliterator(), false)
        .map(message -> {
            Message newMessage = new Message(message.getId(), message.getMessageKey());
            localizationRepository.findAllByObjectIdAndLocalizedType(message.getId(), LocalizedType.MESSAGE)
                .forEach(localization -> {
                    newMessage.getLocalizations().add(
                        new MessageLocalization(localization.getId(),
                            localization.getLanguage(),
                            localization.getBaseText(),
                            localization.getShortText(),
                            localization.getLongText(),
                            localization.getOrderBy()));
            });
            return newMessage;
        })
        .collect(Collectors.toList());
}

这自然会得出结论,如果Message构造函数接受本地化列表,代码可能更简单......

答案 1 :(得分:0)

感谢@Holger,我已经完成了这项工作(可能这对将来的人有用)

List<Message> messages = StreamSupport.stream(messageRepository.findAll().spliterator(), false)
                .map(message -> new Message(message.getId(),
                        message.getMessageKey(),
                        // list localizations
                        StreamSupport
                                .stream(localizationRepository.findAllByObjectIdAndLocalizedType(message.getId(), LocalizedType.MESSAGE).spliterator(),
                                        false)
                                .map(localization -> new MessageLocalization(localization.getId(),
                                        localization.getLanguage(),
                                        localization.getBaseText(),
                                        localization.getShortText(),
                                        localization.getLongText(),
                                        localization.getOrderBy()))
                                .collect(Collectors.toList()),
                        // list categories
                        StreamSupport.stream(messageCategoryRepository.findAllByMessageId(message.getId()).spliterator(), false)
                                .map(msgCategory -> new MessageCategory(msgCategory.getId(), msgCategory.getMessageId(), msgCategory.getCategoryId()))
                                .collect(Collectors.toList())

                )).collect(Collectors.toList());