У меня есть объект с данными с некоторыми полями для каждой части, но некоторые поля для каждого условия, для каждой части (данные для каждого условия находятся в подклассе PartData):
class Part {
// per part data
final String part_number;
public Part(String part_number) {
this.part_number = part_number;
condition_id_to_data = new HashMap<>();
}
public String getPart_number() {
return part_number;
}
Map<Integer, PartData> condition_id_to_data;
public PartData getData(int condition_id) {
return condition_id_to_data.get(condition_id);
}
// per condition data
class PartData {
final int condition_id;
public PartData(int condition_id) {
this.condition_id = condition_id;
}
BigDecimal sales;
BigDecimal quotes;
public BigDecimal getQuotes() {
return quotes;
}
public BigDecimal getSales() {
return sales;
}
}
}
Мне нужно написать лямбда-функцию, которая будет возвращать данные при применении части / условия:
Function<Part, String> part_number_function;
Function<Part, Function<Integer, BigDecimal>> sales_function;
Function<Part, Function<Integer, BigDecimal>> quotes_function;
void go() {
Part part = ...;
int condition_id = ...;
part_number_function = Part::getPart_number; // Got this part
String part_number = part_number_function.apply(part); // works
sales_function = Part::getData ... ?
quotes_function = Part::getData ... ?
BigDecimal sales = sales_function.apply(part).apply(condition_id);
BigDecimal quotes = quotes_function.apply(part).apply(condition_id);
}
Как применить две переменные в лямбда-функции?

Когда я задавал вопрос, я искал «двухаргументную лямбда-функцию Java» и нашел этот вопрос SO: Может ли лямбда-выражение Java иметь более одного параметра?
Итак, я создал класс BiFunction:
@FunctionalInterface
interface BiFunction<One, Two, Three> {
public Three apply(One one, Two two);
}
Это относится к One и Two и возвращает Three
И написал такие методы:
Function<Part, String> part_number_function;
BiFunction<Part, Integer, BigDecimal> sales_function;
BiFunction<Part, Integer, BigDecimal> quotes_function;
void go() {
Part part = ...;
int condition_id = ...;
part_number_function = a_part -> a_part.getPart_number();
sales_function = (a_part, b_cond) -> a_part.getData(b_cond).sales;
quotes_function = (a_part, b_cond) -> a_part.getData(b_cond).quotes;
String part_number = part_number_function.apply(part);
BigDecimal sales = sales_function.apply(part, condition_id);
BigDecimal quotes = quotes_function.apply(part, condition_id);
}
И это работает