我还是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()));
});
});
}
所以我在这里有两个步骤:
Message
列表Message
列表并从其他存储库中检索其本地化的数据这可以更简单地重写(例如包括第一步中的第二步)吗?
由于
答案 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());