有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何更改流<Object>的值?

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

我正在使用内存来实现repository

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

store是HashMap对象

Map<Long, Message> store = new HashMap<>();

我将向您展示Message类以及我如何尝试失败的部分

public class Message {
    private long index;
    private long sender_id;
    private long receiver_id;
    private Date transmitted_time;
    private Date read_time;
    private boolean readOrNot;
    private String text;
    .
    .
    .
}

我是如何尝试的:

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

问题是如何更改receivedOrNot之前的date值并与sender_idreceiver_id匹配


共 (2) 个答案

  1. # 1 楼答案

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

    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;
    }
    
  2. # 2 楼答案

    如果我理解正确,所有通过筛选条件的Message对象都应该用setReadOrNot(true)更新,应该在List中返回

    如果是这样,那么您可以使用peek()collect(toList())

    public List<Message> read(long sender_id, long receiver_id, Date date) {
        return store.values()
            .stream()
            .filter(message -> !message.isReadOrNot()
                             && message.getSender_id() == sender_id
                             && message.getReceiver_id() == receiver_id
                             && message.getTransmitted_time().compareTo(date) > 0)
            .peek(message -> message.setReadOrNot(true))
            .collect(Collectors.toList());
    }
    

    要设置read_time,请使用lambda表达式块:

            .peek(message -> {
                message.setReadOrNot(true);
                message.setRead_time(new Date(System.currentTimeMillis()));
            })