Lambda等于使用选项和映射器

时间:2015-12-10 14:48:06

标签: java lambda java-8

假设我有两个对象,并且我想知道特定属性是否相等(空值完全按照我的意愿管理):

// pre java 8

public static boolean equalsProp(SomeObject a, SomeObject b)
{
    Object aProp = a != null ? a.getProp() : null;
    Object bProp = b != null ? b.getProp() : null;

    return  (aProp == bProp) || (aProp != null && aProp.equals(bProp));
}

现在我有java 8,我可以将它重写为通用:

public static <T, U> boolean equals(T a, T b, Function<? super T, ? extends U> mapper)
{
    Object aProp = Optional.ofNullable(a).map(mapper).orElse(null);
    Object bProp = Optional.ofNullable(b).map(mapper).orElse(null);

    return (aProp == bProp) || (aProp != null && aProp.equals(bProp));
}

但我不喜欢在我的一个班级中定义这样的方法。

是否有java.lang.something.SomeJreBundledClass.equals(a, b, func)才能完成此操作?

是否有最佳实践方法(可能没有实用方法)?

也许我不清楚我在问什么,我会再试一次。

我有这段代码:

Table t1 = ...
Table t2 = ...

if(!my.package.utils.ObjectUtils.equals(t1, t2, Table::getPrimaryKey))
{
    // ok, these tables have different primary keys
}

我在问:

  • 有一个 JRE 类可以完成my.package.utils.ObjectUtils的工作
  • 有一种更好,更短,容忍的方法来比较t1.primaryKeyt2.primaryKey ,而无需编写实用程序方法。

3 个答案:

答案 0 :(得分:1)

使用流来考虑这个:

static class MyClass {
    String prop;

    public String getProp(){
        return prop;
    }
}
/**
 * @param args the command line arguments
 */
public static void main(String[] args) {

    MyClass a = new MyClass();
    MyClass b = new MyClass();
    a.prop = "foo";
    b.prop = "foo";
    boolean e = Stream.of(a,b).filter(Objects::nonNull).map(MyClass::getProp).distinct().count() != 2;
    System.out.println("e = " + e);
    a = null;
    b = null;
    e = Stream.of(a,b).filter(Objects::nonNull).map(MyClass::getProp).distinct().count() != 2;
    System.out.println("e = " + e);
}

答案 1 :(得分:1)

  

我问是否:

     
      
  • 有一个 JRE 类可以完成my.package.utils.ObjectUtils的工作
  •   
  • 在没有编写实用程序方法的情况下,比较t1.primaryKeyt2.primaryKey 是一种更好,更短且容忍的方法。
  •   

对于您的第一个问题,就是答案。

对于您的第二个问题,也是答案,除非您准备让您的代码非常苛刻地比较对象。

你要表达的是等同性。几个框架可以帮助您使用该上下文。其中最值得注意的是具有Equivalence类/框架的番石榴。在这种情况下,不必编写实用程序方法,因为它们存在于其他地方。

答案 2 :(得分:1)

也许你可以使用这样的东西:

Comparator.comparing(SomeObject::getProp).compare(a, b) == 0
Comparator.comparing(Table::getPrimaryKey).compare(table1, table2) == 0