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.datejava.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;
}