使用lambda表达式由值类的成员搜索TreeMap

8 java collections lambda java-8 java-stream

我有一个与Java 8中的lambda表达式相关的问题.

考虑以下Message课程:

  public class Message implements MessageBase 
  {  
      private String id;
      private String message;
      private String author;
      private Long timestamp;

      public Message()
      {
          this.id=null;
          this.message=null;
          this.author=null;
          this.timestamp= null;
      }

      public Message(String id, String message,String author,Long timestamp)
      {
          this.id=id;
          this.message=message;
          this.author=author;
          this.timestamp= timestamp;
      }

      public String getId() 
      {
          return id;
      }

      public void setId(String id) 
      {
          this.id = id;
      }

      public String getMessage() 
      {
          return message;
      }

      public void setMessage(String message) 
      {
          this.message = message;
      }

      public String getAuthor() 
      {
          return author;
      }

      public void setAuthor(String author) 
      {
          this.author = author;
      }

      public long getTimestamp() 
      {
          return timestamp;
      }

      public void setTimestamp(long timestamp) 
      {
          this.timestamp = timestamp;
      }

      @Override
      public boolean equals(Object o) 
      {
          if (this == o) 
              return true;
          if (!(o instanceof Message)) 
              return false;

          Message message1 = (Message) o;

          if (getTimestamp() != message1.getTimestamp()) 
              return false;
          if (!getId().equals(message1.getId())) 
              return false;
          if (!getMessage().equals(message1.getMessage())) 
              return false;
          return getAuthor().equals(message1.getAuthor());
      }

      @Override
      public int hashCode() 
      {
          int result = getId().hashCode();
          result = 31 * result + getMessage().hashCode();
          result = 31 * result + getAuthor().hashCode();
          result = 31 * result + (int) (getTimestamp() ^ (getTimestamp() >>> 32));
          return result;
      }

      @Override
      public String toString() 
      {
          return "id=" + id +
                  ", message='" + message + '\'' +
                  ", author='" + author + '\'' +
                  ", timestamp=" + timestamp;
      }
Run Code Online (Sandbox Code Playgroud)

它实现了MessageBase接口.我将Message类的对象存储在TreeMap- 中Map<Long, Message> messages.键是时间戳,值是Message对象.我必须TreeMap按作者查找所有条目,这是Message该类的一个字段.我正在尝试使用lambda表达式.

这是我的代码:

messages.entrySet().stream().filter(o->o.getValue().getAuthor().equalsIgnoreCase(author)).findAny();
Run Code Online (Sandbox Code Playgroud)

使用此代码,我只能获得一个条目.你能帮我看一下通过过滤器的所有条目的列表吗?

Era*_*ran 8

findAny最多返回一个条目.您应该将Stream收集到a Collection或a中Map以获取所有条目:

Map<Long, Message> filteredMessages =   
    messages.entrySet()
            .stream()
            .filter(o->o.getValue().getAuthor().equalsIgnoreCase(author))
            .collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));
Run Code Online (Sandbox Code Playgroud)

要么

List<Map.Entry<Long, Message>> filteredMessages =   
    messages.entrySet()
            .stream()
            .filter(o->o.getValue().getAuthor().equalsIgnoreCase(author))
            .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)