如何在lambda过滤器中使用多个声明?
我对Lambdas还很陌生,我尝试用下面的方法使用它,但它似乎不起作用。如果其中一个是条件,是否可能有多个声明如何在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.
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());
}