使用java流而不是for each循环迭代和过滤列表

yyhrrdl8  于 2021-07-07  发布在  Java
关注(0)|答案(2)|浏览(346)

在与我正在实现的聊天机器人聊天时,我有一个会话列表,每个会话都有一个消息列表。我想添加那些对话,它的最后一条消息不是聊天机器人消息,也不是由用户查看到一个对话列表。为此,我将其编码为:

List<ConversationDto> conversationsToBeSent = new ArrayList<>();

for (ConversationDto conversation : super.allConversations) {
    if (conversation.getMessages() != null) {
        if (conversation.getMessages().get(0).getMessageType().getId() != MessageTypeEnum.CHATBOT.getValue()
                && conversation.getMessages().get(0).getToViewedAt() == null) {
            conversationsToBeSent.add(conversation);
        }
    }

}

这是有效的。问题是如何使用lambda和stream而不是for each编写代码。

izj3ouym

izj3ouym1#

要在列表中使用流,只需执行以下操作 super.allConversations.stream() 如果只想选择一些元素,可以使用 filter 方法如下:

super.allConversations.stream().filter(
  conversation ->
    conversion != null && 
    conversation.getMessages().get(0).getMessageType().getId() != MessageTypeEnum.CHATBOT.getValue() &&
    conversation.getMessages().get(0).getToViewedAt() == null
);
ddrv8njm

ddrv8njm2#

你的问题是一个经典的“过滤集合”任务。这就是 Stream.filter() 方法确实如此。
代码块:

List<Item> newList = new ArrayList<>();
for (Item item : collection) {
    if (predicate(item)) {
        newList.add(item);
    }
}

通常可以转换为:

List<Item> newList = 
    collection
        .stream()
        .filter(item -> predicate(item))
        .collect(Collectors.toList());

在您的例子中,代码转换如下。请注意以下代码块中的注解以获取解释:

List<ConversationDto> conversationsToBeSent = super.allConversations // Start with the original list
    .stream() // Get a stream of list items
    .filter(conversation -> // Filter the list items
        conversation.getMessages() != null
        && !conversation.getMessages().isEmpty() // YOU PROBABLY WANT THIS CHECK AS WELL!
        && conversation.getMessages().get(0).getMessageType().getId() != MessageTypeEnum.CHATBOT.getValue()
        && conversation.getMessages().get(0).getToViewedAt() == null
    )
    .collect(Collectors.toList()); // Collect the stream items to a new list

相关问题