■ はじめに
* SQLとかでよくやる過去直近をJava8から導入されたラムダ式で書いてみる。
■ 方法
他にもっといい方法がありそうだが...
* filter と max/min で実装する。
list.stream().filter(x -> x.【日付】.compareTo(【基準日】) <= 0)
.max((x1, x2) -> x1.【日付】.compareTo(x2.【日付】)).get();
// [1] filter で【基準日】より未来日を間引く
// [2][1]で間引いたデータから最新日付を取得する
補足
* 前提条件として、同一日付データはないものとしている
■ サンプル
import java.math.BigDecimal;
import java.util.Calendar;
public class Rate {
private String currency;
private BigDecimal rateValue;
private Calendar date;
public Rate(String currency, BigDecimal rateValue, Calendar date) {
this.currency = currency;
this.rateValue = rateValue;
this.date = date;
}
public String getCurrency() {
return this.currency;
}
public void setCurrency(String currency) {
this.currency = currency;
}
public BigDecimal getRateValue() {
return this.rateValue;
}
public void setRateValue(BigDecimal rateValue) {
this.rateValue = rateValue;
}
public Calendar getDate() {
return this.date;
}
public void setDate(Calendar date) {
this.date = date;
}
}
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Rate> rates = new ArrayList<>();
rates.add(new Rate("JPY", new BigDecimal("101.12"), createCalendar(2017, 11, 20)));
rates.add(new Rate("JPY", new BigDecimal("120.90"), createCalendar(2018, 8, 10)));
rates.add(new Rate("JPY", new BigDecimal("110.01"), createCalendar(2017, 7, 10)));
rates.add(new Rate("JPY", new BigDecimal("98.96"), createCalendar(2017, 4, 10)));
rates.add(new Rate("JPY", new BigDecimal("87.45"), createCalendar(2015, 3, 20)));
Calendar targerDate1 = createCalendar(2017, 6, 10);
Rate result1 = getLatetRate(rates, targerDate1);
System.out.println("Latest Rate from 2017/5/10 : " + result1.getRateValue());
Calendar targerDate2 = createCalendar(2018, 10, 10);
Rate result2 = getLatetRate(rates, targerDate2);
System.out.println("Latest Rate from 2018/9/10 : " + result2.getRateValue());
Calendar targerDate3 = createCalendar(2017, 7, 10);
Rate result3 = getLatetRate(rates, targerDate3);
System.out.println("Latest Rate from 2017/6/10 : " + result3.getRateValue());
}
// 過去直近
private static Rate getLatetRate(List<Rate> rates, Calendar targerDate) {
return rates.stream().filter(rate -> rate.getDate().compareTo(targerDate) <= 0)
.max((rate1, rate2) -> rate1.getDate().compareTo(rate2.getDate())).get();
}
private static Calendar createCalendar(int year, int month, int day) {
Calendar returnValue = Calendar.getInstance();
returnValue.set(year, month, day);
return returnValue;
}
}
出力結果
Latest Rate from 2017/5/10 : 98.96
Latest Rate from 2018/9/10 : 120.90
Latest Rate from 2017/6/10 : 110.01