如何在lambda过滤器中使用多个声明?

如何在lambda过滤器中使用多个声明?,lambda,java-8,Lambda,Java 8,我对Lambdas还很陌生,我尝试用下面的方法使用它,但它似乎不起作用。如果其中一个是条件,是否可能有多个声明 ArrayList<Message> msgs = new ArrayList<>(ms.values()); Calendar cal = Calendar.getInstance(); msgs.stream().filter( m -> { cal.setTime(m.getCreated()); cal.get(Calendar.

我对Lambdas还很陌生,我尝试用下面的方法使用它,但它似乎不起作用。如果其中一个是条件,是否可能有多个声明

ArrayList<Message> msgs = new ArrayList<>(ms.values());
Calendar cal = Calendar.getInstance();

msgs.stream().filter( m -> {
    cal.setTime(m.getCreated());
    cal.get(Calendar.YEAR) == year
});
但是,由于我需要设置日期,并将其与日历一起使用,以获得年份,因此我必须在两个声明中执行此操作

我知道这是可行的:

msgs.forEach(m -> {
    cal.setTime(m.getCreated());
    if (cal.get(Calendar.YEAR) != year) {
        msgs.remove(m);
    }
});

但是我想知道是否有可能按照我尝试的方式来做,或者做一些相对类似的事情?

如果使用大括号,则需要返回一个值。它需要一个布尔返回值。它只是假设如果没有大括号

返回cal.get(日历年)=年

但我想知道是否有可能以我正在尝试的方式,或者类似的方式来做

您甚至不需要使用旧的
Calendar
API。由于您使用的是旧的
日期
,因此需要将其转换为Java 8,而Java 8具有

然后,您的过滤器将如下所示(为了清晰起见,提取为一种方法):

列表过滤器年份(整数年,列表MSG){
返回msgs.stream()
.filter(msg->msg.getCreated().toInstant().atZone(ZoneId.systemDefault()).getYear()==year)
.collect(Collectors.toList());
}
是Java8中的一个新方法,我们在这里使用它作为旧的
Date
和Java8日期和时间API之间的桥梁。转换可能看起来有点乏味,但这是因为
日期
不完全是日期:

尽管名称不同,java.util.Date表示时间线上的一个瞬间,而不是“日期”。自1970-01-01T00:00Z(1970 GMT/UTC开始时的午夜)以来,存储在对象中的实际数据是一个很长的毫秒计数

msgs.forEach(m -> {
    cal.setTime(m.getCreated());
    if (cal.get(Calendar.YEAR) != year) {
        msgs.remove(m);
    }
});
List<Message> filterOnYear(int year, List<Message> msgs) {
  return msgs.stream()
      .filter(msg -> msg.getCreated().toInstant().atZone(ZoneId.systemDefault()).getYear() == year)
      .collect(Collectors.toList());
}