2016-11-27 12 views
2

私はLambdasには新しく、次のように使ってみたいと思っていますが、うまくいかないようです。複数の宣言を持つことは可能ですか?ONEが条件ですか?ラムダフィルタで複数​​の宣言を使用するには?

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

しかし、私はDateを設定し、年間取得するCalendarでそれを使用する必要があるため、私は2つの宣言でこれを行う必要があります:

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

しかし、私はそれを私がしようとしている方法、または比較的似た何かをすることが可能であるかどうかを知りたいですか?

答えて

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()は、我々はここに古いDateとJava間のブリッジとして使用するJava 8、で新しい方法です。

あなたのフィルタは、(明確にするための方法に抽出された)このようになります。 8日時API。変換は少し退屈に見えるかもしれませんが、Dateが正確に日付、as discussed hereではないので、それは次のとおりです。その名前にもかかわらず

、java.util.Dateは、タイムライン上のインスタントではなく、「日付を表し"オブジェクト内に格納される実際のデータは、1970-01-01T00:00Z(1970 GMT/UTCの開始時の深夜)から長いミリ秒数です。

関連する問題