Java 8 java 8流问题';s采集器接口
我拥有以下JPA实体:Java 8 java 8流问题';s采集器接口,java-8,java-stream,Java 8,Java Stream,我拥有以下JPA实体: @Entity public class Message { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @NotNull @ManyToOne(fetch = FetchType.LAZY) private Member sender; @NotNull @ManyToOne(fetch = FetchTyp
@Entity
public class Message {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@NotNull
@ManyToOne(fetch = FetchType.LAZY)
private Member sender;
@NotNull
@ManyToOne(fetch = FetchType.LAZY)
private Member recipient;
从邮件集合(收集邮件
)中,我试图通过在收件人或发件人字段上按分组来获取映射邮件映射
为了进一步定义我的用例,连接的成员(currentMember)将大量已发送和已接收的消息附加到其实例。我希望检索消息并将其添加到包含所有已连接成员消息(已发送或已接收)的集合中,如下所示:
Collection<Message> messages = new ArrayList<Message>();
messages.addAll(currentMember.getSentMessages());
messages.addAll(currentMember.getReceivedMessages());
Collection messages=new ArrayList();
messages.addAll(currentMember.getSentMessages());
messages.addAll(currentMember.getReceivedMessages());
对于当前成员与之交换了至少一条消息的其他成员/对方成员,我希望获得所有交换消息的列表
然后,我将能够构建上面的Map messageMap
这是流api的开箱即用,还是我需要实现我自己的收集器?如果我正确理解了您的问题,您希望通过使用接收方作为发送消息的密钥和使用发送方作为接收消息的密钥来统一处理消息。可以通过在collect操作中使用条件来完成此操作:
Map<Member, List<Message>> map = Stream.concat(
currentMember.getSentMessages().stream(), currentMember.getReceivedMessages().stream())
.collect(Collectors.groupingBy(msg ->
msg.getSender()==currentMember? msg.getRecipient(): msg.getSender()));
在这里,不仅成对的包装使代码复杂化,而且由于所需的展开,收集操作的代码也变得更加复杂
选择哪个方向取决于你
Map<Member, List<Message>> map =
Stream.concat(
currentMember.getSentMessages().stream().map(msg ->
new AbstractMap.SimpleImmutableEntry<>(msg.getRecipient(), msg)),
currentMember.getReceivedMessages().stream().map(msg ->
new AbstractMap.SimpleImmutableEntry<>(msg.getSender(), msg)))
.collect(Collectors.groupingBy(e -> e.getKey(),
Collectors.mapping(e->e.getValue(), Collectors.toList())));