当前位置: 首页 > 知识库问答 >
问题:

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

姬锐
2023-03-14

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

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 ...

共有1个答案

尉迟正平
2023-03-14

您的函数有两个参数,所以它们是bifunction (首先是参数的类型,return/target类型是最后一个)。所以您有私有列表 >函数

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

private List<BiFunction<NeedCompare, NeedCompare, BigDecimal>> functions 
    = Arrays.asList(this::compareCategory, this::compareName, 
        this::compareValue, this::compareAmount);
 类似资料:
  • 问题内容: 我有两个列表 , 都包含 MyData 类型的对象,而 MyData* 包含这些变量。 利斯塔和数组listB都包含MyData的对象,现在我要两个列表的对象值比较这里 的名字 ,以及 检查 变量一样,如果 利斯塔 包含这些对象值 和ListB也包含 然后我必须比较列表并返回false,因为两个列表相同但是如果ListA包含 和 ListB 包含 然后我必须比较列表并返回true,因为

  • 问题内容: 我有两个像这样的对象数组: 我想知道数组是否相等。我定义的是相等的,因为array1中的每个值都与array2中该位置的值相同。因此,这两个数组将相等。 为什么最好找出这两个数组是否相等? 不是一个很深的等式,所以它是行不通的,我不知道是否遍历每个元素并进行比较是解决此问题的最佳,最有效的方法。有没有人有更好的建议? 编辑:我需要一个可以放入嵌套数组的等于。 问题答案: 使用。这项功能

  • 问题内容: 我有两个从同一类实例化的java对象。 如果我将它们的两个属性都设置为完全相同的值,然后验证它们是否相同 但是,这些方法都不返回真实值。我已经检查了每个属性,并且它们匹配。 如何比较这两个对象以验证它们是否相同? 问题答案: 你需要提供自己的实现。 如果哈希表中有可能使用你的对象,则还应该重写。一个合理的实施将是该对象的字段的哈希码喜欢的东西结合起来:

  • 第一次来这里,所以我希望这是有意义的! 我有两个对象数组,比如l1和l2,我想在这两个列表之间进行比较,并在l3中得到一个不匹配的值。用户类包含2个字符串: 比如,l1包含:Java、JSF、JAXR、foo l2包含:JSF、JAXR 我可以对匹配的值进行比较,但不能对不匹配的值进行比较。这种逻辑似乎有缺陷。有什么帮助吗? 对于匹配值: 但是,对于不匹配,当我说不等于时,我得到的不是唯一的值,而