如何使用 Java 中的函数列表来比较两个对象的字段并求和结果

Dia*_*ome 3 java function java-stream

我有两个对象可以对函数列表中的每个字段使用不同的函数逐个字段进行比较。

目标:compare(NeedCompare n1, NeedCompare n2)使用函数列表调用并获得 BigDecimal value = compareAmount(NeedCompare needCompare1, NeedCompare needCompare2) .add(compareValue(NeedCompare needCompare1, NeedCompare needCompare2) .add(compareName(NeedCompare needCompare1, NeedCompare needCompare2) .add(compareCategory(NeedCompare needCompare1, NeedCompare needCompare2)))))

用流制作它会是完美的。

public class NeedCompare {
private BigDecimal category;
private String name;
private BigDecimal value;
private BigDecimal amount;

// The list is wrong and I don't know how to organize it
private List<Function<BigDecimal, NeedCompare>> functions = Arrays.asList(
        (needCompare1, needCompare2) -> compareCategory(needCompare1, needCompare2),
        (needCompare1, needCompare2) -> compareName(needCompare1, needCompare2),
        (needCompare1, needCompare2) -> compareValue(needCompare1, needCompare2),
        (needCompare1, needCompare2) -> compareAmount(needCompare1, needCompare2)

);

public BigDecimal compare(NeedCompare n1, NeedCompare n2) {
    //The method is broken. I need to return a sum of the results of the functions
    return functions.stream().map(function -> function(n1, n2)).reduce(BigDecimal.ZERO, BigDecimal::add);
}

private BigDecimal compareAmount(NeedCompare needCompare1, NeedCompare needCompare2) {
    // Complex function to compare category of NeedCompare
    return needCompare1.getCategory().equals(needCompare2.getCategory()) ? BigDecimal.ZERO : BigDecimal.ONE;
}

private BigDecimal compareValue(NeedCompare needCompare1, NeedCompare needCompare2) {
    // Complex function to compare name of NeedCompare
    return needCompare1.getName().equals(needCompare2.getName()) ? BigDecimal.ZERO : BigDecimal.ONE;
}

private BigDecimal compareName(NeedCompare needCompare1, NeedCompare needCompare2) {
    // Complex function to compare value of NeedCompare
    return needCompare1.getValue().equals(needCompare2.getValue()) ? BigDecimal.ZERO : BigDecimal.ONE;
}

private BigDecimal compareCategory(NeedCompare needCompare1, NeedCompare needCompare2) {
    // Complex function to compare amount of NeedCompare
    return needCompare1.getAmount().equals(needCompare2.getAmount()) ? BigDecimal.ZERO : BigDecimal.ONE;
}
// Getters and setters ...
Run Code Online (Sandbox Code Playgroud)

Pol*_*ome 5

您拥有的函数采用两个参数,因此它们是BiFunction<NeedCompare, NeedCompare, BigDecimal>(首先是参数的类型,最后是返回/目标类型)。所以你有private List<BiFunction<NeedCompare, NeedCompare, BigDecimal>> functions

此外,您可以通过使用方法引用而不是 lambdas 来简单地使列表更具可读性:

private List<BiFunction<NeedCompare, NeedCompare, BigDecimal>> functions 
    = Arrays.asList(this::compareCategory, this::compareName, 
        this::compareValue, this::compareAmount);
Run Code Online (Sandbox Code Playgroud)