【问题标题】:Apply nested Lambda function Java 8应用嵌套 Lambda 函数 Java 8
【发布时间】:2018-05-29 04:56:28
【问题描述】:

我有一个对象的数据,其中一些字段是每个部分,但一些字段是每个条件,每个部分(每个条件的数据在子类 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;
        }
    }
}

我需要编写一个 lambda 函数,该函数将在应用部分/条件时返回数据:

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

如何在 lambda 函数中应用两个变量?

【问题讨论】:

    标签: lambda


    【解决方案1】:

    当我问这个问题时,我搜索了“两个参数 java lambda 函数”并找到了这个 SO 问题:Can a java lambda have more than 1 parameter?

    所以,我创建了一个BiFunction 类:

    @FunctionalInterface
    interface BiFunction<One, Two, Three> {
        public Three apply(One one, Two two);
    }
    

    这适用于OneTwo 并返回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);
    }
    

    这行得通

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多