【Java】ラムダ式 ~ 応用編 / サンプル集・その2 / 過去直近データを取得する ~

■ はじめに

 * SQLとかでよくやる過去直近をJava8から導入されたラムダ式で書いてみる。

■ 方法

他にもっといい方法がありそうだが...
 * filter と max/min で実装する。

list.stream().filter(x -> x.【日付】.compareTo(【基準日】) <= 0)
        .max((x1, x2) -> x1.【日付】.compareTo(x2.【日付】)).get();

// [1] filter で【基準日】より未来日を間引く
// [2][1]で間引いたデータから最新日付を取得する

補足

 * 前提条件として、同一日付データはないものとしている

■ サンプル

Rate.java

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

Main.java

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

関連記事

Javaラムダ式 ~入門編~

https://blogs.yahoo.co.jp/dk521123/34188394.html

Javaラムダ式 ~ 基本編 / Stream API

https://blogs.yahoo.co.jp/dk521123/34192426.html

ラムダ式 ~ 応用編 / サンプル集・その1 ~

https://blogs.yahoo.co.jp/dk521123/37093852.html

ラムダ式 ~ 応用編 / サンプル集・その2 / 過去直近データを取得する ~

https://blogs.yahoo.co.jp/dk521123/37132834.html