2016-11-27 21 views
2

我對Lambdas很新,我試圖按照以下方式使用它,但似乎不起作用。是否可以有多個聲明,其中ONE是這些條件?如何在lambda過濾器中使用多個聲明?

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

msgs.stream().filter(m -> { 
    cal.setTime(m.getCreated()); 
    cal.get(Calendar.YEAR) == year 
}); 

據我所知,它的工作原理是:

collection.stream().filter(x -> 1 == x); 

但因爲我需要設置Date,並用它來與Calendar拿到一年,我會做這兩個聲明。

我知道這個工程:

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

但我想知道是否有可能做到這一點我想的方式,或東西比較相似?

回答

3

如果使用花括號,則需要返回值。它期望一個布爾返回值。它只是假設,如果沒有大括號。

return cal.get(Calendar.YEAR) == year;

1

但我想知道是否有可能做到這一點我想的方式,或東西比較相似?

您甚至不需要使用舊的Calendar API。由於您使用的是舊版本Date,因此您需要將其轉換爲具有a simple method to get the year的Java 8 ZonedDateTime。然後

你的過濾器應該是這樣的(提取到了清晰的方法):

List<Message> filterOnYear(int year, List<Message> msgs) { 
    return msgs.stream() 
     .filter(msg -> msg.getCreated().toInstant().atZone(ZoneId.systemDefault()).getYear() == year) 
     .collect(Collectors.toList()); 
} 

Date#toInstant()是Java 8,這是我們這裏的老Date和Java之間的橋樑使用的新方法8日期和時間API。轉換似乎有點乏味,但它是因爲Date是不完全是一個日期,as discussed here

儘管它的名字,java.util.Date代表在時間線的瞬間,而不是一個「約會」。存儲在對象中的實際數據自1970-01-01T00:00Z(格林威治標準時間1970年開始時的午夜)算起,是一個很長的毫秒數。

相關問題