Java 如何改变流程<;对象>';s值多少?

Java 如何改变流程<;对象>';s值多少?,java,java-stream,Java,Java Stream,我正在制作一个聊天应用程序 我正在使用内存实现存储库 在read方法中,我想将isReadOrNot更改为true,并返回更改后的消息,其中值isReadOrNot为false,发送方和接收方匹配 store是HashMap对象 Map<Long, Message> store = new HashMap<>(); 我是如何尝试的: public List<Message> read(long sender_id, long receiver_id, Dat

我正在制作一个聊天应用程序

我正在使用内存实现
存储库

read
方法中,我想将
isReadOrNot
更改为
true
,并返回更改后的消息,其中值
isReadOrNot
false
,发送方和接收方匹配

store
是HashMap对象

Map<Long, Message> store = new HashMap<>();
我是如何尝试的:

public List<Message> read(long sender_id, long receiver_id, Date date) {
        long count = store.values()
            .stream()
            .filter(
                    message -> !message.isReadOrNot()
                            && message.getSender_id() == sender_id
                            && message.getReceiver_id() == receiver_id
                            && Long.parseLong(message.getTransmitted_time().toString()) > Long.parseLong(date.toString())
            ).count();

        return null;
    }
已读取公共列表(长发送方id、长接收方id、日期){
长计数=store.values()
.stream()
.过滤器(
message->!message.isReadOrNot()
&&message.getSender\u id()==发件人\u id
&&message.getReceiver_id()==receiver_id
&&Long.parseLong(message.getTransmitted_time().toString())>Long.parseLong(date.toString())
).count();
返回null;
}

问题是如何更改
receivedOrNot
日期之前的
value
并与
sender\u id
receivedOrNot
,如果我理解正确,所有通过筛选条件的
Message
对象都应该更新为
setReadOrNot(true)
,应在
列表中返回

如果是这样,则可以使用
peek()
collect(toList())

已读取公共列表(长发送方id、长接收方id、日期){
返回store.values()
.stream()
.filter(message->!message.isReadOrNot()
&&message.getSender\u id()==发件人\u id
&&message.getReceiver_id()==receiver_id
&&message.getTransmitted_time().compareTo(日期)>0)
.peek(message->message.setReadOrNot(true))
.collect(Collectors.toList());
}
要同时设置
读取时间
,请使用lambda表达式块:

.peek(消息->{
message.setReadOrNot(true);
message.setRead_time(新日期(System.currentTimeMillis());
})

流并不总是最好的方法。如果我这样做,我将使用循环迭代消息,然后相应地修改
消息
对象

public List<Message> read(long sender_id, long receiver_id, Date date) {
     List<Message> results = new ArrayList<>();
     for (Message message : store.values()) {
        // filter here
        if (!message.isReadOrNot()
                         && message.getSender_id() == sender_id
                         && message.getReceiver_id() == receiver_id
                         ...
                         ...
             ) {
                results.add(message);
                message.setReadOrNot(true);
                // other changes to message here
                ...
                ...
        }
     }
     return results;
}
已读取公共列表(长发送方id、长接收方id、日期){
列表结果=新建ArrayList();
对于(消息:store.values()){
//在这里过滤
如果(!message.isReadOrNot()
&&message.getSender\u id()==发件人\u id
&&message.getReceiver_id()==receiver_id
...
...
) {
结果。添加(消息);
message.setReadOrNot(true);
//此处消息的其他更改
...
...
}
}
返回结果;
}

为什么要使用
count
在您的问题中应该是
map
!我试着用它 句子但失败。无关:
日期是什么?当然不是
java.util.Date
,因为
Date.toString()
肯定不是
Long.parseLong()
能够处理的东西。如果它是
java.util.Date
,那么
Date.getTime()
将返回所需的
long
值,尽管您可以这样使用
compareTo()
message.getTransmitted\u time().compareTo(Date)>0
,这是编写它的最短方法,我使用的是java.sql.date,而不是java.util.date
java.sql.date
java.util.date
的子类,
date.toString()
仍然不是Long.parseLong()能够处理的。我的评论同样适用于
java.sql.Date
。感谢您回答这个问题。你的理解是正确的。我能再问一个问题吗?我不仅要设置readOrNot,还要设置read_时间。怎么做@정지원 答案更新。使用你的答案而不是以前的答案有什么好处?以前的答案没有错。这只是个人喜好的问题。然而,问题陈述相对简单,因此使用streams无法获得真正的澄清。在这种情况下,简单循环更有效(streams API中存在显著的开销)。但主要对我来说,根据
peek
的Java API,“此方法主要用于支持调试,您希望在元素流过管道中的某个点时看到它们。”尽管有些人忽略了此建议,但我倾向于遵循它。感谢您的解释。我将搜索关于什么是重要开销的更多细节。我尊重你的倾向。
public List<Message> read(long sender_id, long receiver_id, Date date) {
     List<Message> results = new ArrayList<>();
     for (Message message : store.values()) {
        // filter here
        if (!message.isReadOrNot()
                         && message.getSender_id() == sender_id
                         && message.getReceiver_id() == receiver_id
                         ...
                         ...
             ) {
                results.add(message);
                message.setReadOrNot(true);
                // other changes to message here
                ...
                ...
        }
     }
     return results;
}