如何将Java供应商绑定到对象的实例?

时间:2018-10-06 19:13:05

标签: java method-reference

如何将Java Supplier绑定到对象的现有实例?例如,如果要使用此标头编写自己的compareTo()方法:

public static int myCompareTo(Object o1, Object o2, Supplier<Comparable> supplier) {...}

我希望能够这样称呼它

myCompareTo("Hello", "Hello2", String::length);

其中String(带有大写字母)是一个类,没有对象。那么如何将实例o1绑定到供应商?

4 个答案:

答案 0 :(得分:4)

这是您要搜索的(我相信):

request.user

您可以这样称呼:

public static <T, U extends Comparable<U>> int compare(T o1, T o2, Function<T, U> mapper) {
    return mapper.apply(o1).compareTo(mapper.apply(o2));
}

答案 1 :(得分:3)

实际上,定义方法的更正确方法是:

  private fun checkUsername(username: String) {
      cancelSubscription()
      checkUsernameDisposable = ApiService()
            .checkUsername(username)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe {
              updateUi(it)
      }
  }

答案 2 :(得分:2)

感谢您的回答。其实我现在想通了。我想让提供的对象实例(o1和o2)执行给定的方法。我发现Supplier是错误的接口,而我不得不使用Function。在这里,您可以看到我的工作简化示例:

public static <T> int myCompareTo(T o1, T o2, Function<T, Comparable> getter) {
        return getter.apply(o1).compareTo(getter.apply(o2));
}

之所以必须是Function而不是Supplier的原因是,仅Function等效于接受对象的lambda表达式,并调用该对象上的引用方法。

例如,如果您将方法引用定义为:

Function<TypeOfInstance, ReturnTypeOfReferencedMethod> methodReference = TypeOfInstance::referencedMethod();

然后执行的等效lambda表达式为:

(instance) -> instance.referencedMethod()

其他信息:

编辑:我知道使用Comparator可以完成相同的操作,但是此示例非常简化。在我的应用程序中,这种功能是必需的。我必须创建一个compareTo函数,以一个以上的属性对ArrayList进行排序,因为主sorting属性在列表中可能不是唯一的。我想与您分享我的代码,因为我认为这对您可能是一个有趣的见解。

public static <T> int ultimateCompare(T o1, T o2, Function<T, Comparable>... getters) {
    for (Function<T, Comparable> getter : getters) {
        int result = getter.apply(o1).compareTo(getter.apply(o2));
        if (result != 0) return result;
    }
    return 0;
}

例如,使用此功能,您可以按姓氏对人员列表进行排序,如果其中两个相同,则可以使用名字进行排序。使用此解决方案,您可以在运行时更改排序。

答案 3 :(得分:1)

您可以使用

Comparator.comparing(String::length);

获得一个比较器实例,您可以将其传递给该方法。