How to bind a Java Supplier to an instance of an object?
Clash Royale CLAN TAG#URR8PPP
up vote
8
down vote
favorite
How can I bind a Java Supplier
to an existing instance of an Object? For example, if I want to write my own compareTo()
method with this header:
public static int myCompareTo(Object o1, Object o2, Supplier<Comparable> supplier) ...
I want be able to call it like:
myCompareTo("Hello", "Hello2", String::length);
where String
(with the capital letter) is a class and no object. So how can I bind the instance o1
to the supplier?
java method-reference
New contributor
add a comment |Â
up vote
8
down vote
favorite
How can I bind a Java Supplier
to an existing instance of an Object? For example, if I want to write my own compareTo()
method with this header:
public static int myCompareTo(Object o1, Object o2, Supplier<Comparable> supplier) ...
I want be able to call it like:
myCompareTo("Hello", "Hello2", String::length);
where String
(with the capital letter) is a class and no object. So how can I bind the instance o1
to the supplier?
java method-reference
New contributor
btw you could accept an answer here....
â Eugene
15 hours ago
add a comment |Â
up vote
8
down vote
favorite
up vote
8
down vote
favorite
How can I bind a Java Supplier
to an existing instance of an Object? For example, if I want to write my own compareTo()
method with this header:
public static int myCompareTo(Object o1, Object o2, Supplier<Comparable> supplier) ...
I want be able to call it like:
myCompareTo("Hello", "Hello2", String::length);
where String
(with the capital letter) is a class and no object. So how can I bind the instance o1
to the supplier?
java method-reference
New contributor
How can I bind a Java Supplier
to an existing instance of an Object? For example, if I want to write my own compareTo()
method with this header:
public static int myCompareTo(Object o1, Object o2, Supplier<Comparable> supplier) ...
I want be able to call it like:
myCompareTo("Hello", "Hello2", String::length);
where String
(with the capital letter) is a class and no object. So how can I bind the instance o1
to the supplier?
java method-reference
java method-reference
New contributor
New contributor
edited 2 days ago
LAD
1,637719
1,637719
New contributor
asked 2 days ago
Philipp NiedergesäÃ
648
648
New contributor
New contributor
btw you could accept an answer here....
â Eugene
15 hours ago
add a comment |Â
btw you could accept an answer here....
â Eugene
15 hours ago
btw you could accept an answer here....
â Eugene
15 hours ago
btw you could accept an answer here....
â Eugene
15 hours ago
add a comment |Â
4 Answers
4
active
oldest
votes
up vote
3
down vote
Here's what you were searching for (I believe):
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));
You can call that like so:
compare("str1", "str2", String::length); // 0
I think you were the closest, here, but not entirely close
â Eugene
2 days ago
add a comment |Â
up vote
3
down vote
Actually a more correct way to define your method would be:
private static <T, U extends Comparable<? super U>> int myCompareTo(T left, T right, Function<T, U> fu)
return Comparator.comparing(fu).compare(left, right);
add a comment |Â
up vote
1
down vote
You can use
Comparator.comparing(String::length);
to obtain a comparator instance which you can pass to the method.
1
Comparator.comparing(String::length).compare("Hello1", "Hello2");
will be shorter :)
â Oleksandr
2 days ago
Of course it will. I tried to satisfy the providedmyCompareTo
interface.
â senjin.hajrulahovic
2 days ago
1
@Oleksandr should have made that an answer IMO, if you didn't I did
â Eugene
2 days ago
add a comment |Â
up vote
1
down vote
accepted
Thanks for your answers. Actually I figured it out now. I wanted to have the supplied object instances (o1 and o2) to execute the given method. I found out that Supplier was the wrong interface instead I had to use Function. Here you can see my working simplified example:
public static <T> int myCompareTo(T o1, T o2, Function<T, Comparable> getter)
return getter.apply(o1).compareTo(getter.apply(o2));
The reason, the interface has to be Function and not Supplier is, that only Function is equivalent to a lambda expression taking an object and calls the referenced method on the object.
For example, if you define the method reference as:
Function<TypeOfInstance, ReturnTypeOfReferencedMethod> methodReference = TypeOfInstance::referencedMethod();
then the equivalent lambda expression being executed is:
(instance) -> instance.referencedMethod()
Additional Information:
Edit: I know I could have done the same by using Comparator, but this example is very simplified. In my application a Function of this kind is neccessary. I had to create a compareTo function that sorts an ArrayList by more than one attribute because the main sorting attribute may not be unique in the list. I want to share my code with you, because I think it can be a interesting insight for you.
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;
With this for example, you can sort a list of persons by last name and if two of them are identical, you can use the first name to sort. With this solution you can change sorting at runtime.
New contributor
You can useComparator.thenComparing
to construct aComparator
that will take into account an arbitrary number of attributes, in order.
â László van den Hoek
yesterday
add a comment |Â
4 Answers
4
active
oldest
votes
4 Answers
4
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
3
down vote
Here's what you were searching for (I believe):
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));
You can call that like so:
compare("str1", "str2", String::length); // 0
I think you were the closest, here, but not entirely close
â Eugene
2 days ago
add a comment |Â
up vote
3
down vote
Here's what you were searching for (I believe):
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));
You can call that like so:
compare("str1", "str2", String::length); // 0
I think you were the closest, here, but not entirely close
â Eugene
2 days ago
add a comment |Â
up vote
3
down vote
up vote
3
down vote
Here's what you were searching for (I believe):
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));
You can call that like so:
compare("str1", "str2", String::length); // 0
Here's what you were searching for (I believe):
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));
You can call that like so:
compare("str1", "str2", String::length); // 0
answered 2 days ago
steffen
8,35412052
8,35412052
I think you were the closest, here, but not entirely close
â Eugene
2 days ago
add a comment |Â
I think you were the closest, here, but not entirely close
â Eugene
2 days ago
I think you were the closest, here, but not entirely close
â Eugene
2 days ago
I think you were the closest, here, but not entirely close
â Eugene
2 days ago
add a comment |Â
up vote
3
down vote
Actually a more correct way to define your method would be:
private static <T, U extends Comparable<? super U>> int myCompareTo(T left, T right, Function<T, U> fu)
return Comparator.comparing(fu).compare(left, right);
add a comment |Â
up vote
3
down vote
Actually a more correct way to define your method would be:
private static <T, U extends Comparable<? super U>> int myCompareTo(T left, T right, Function<T, U> fu)
return Comparator.comparing(fu).compare(left, right);
add a comment |Â
up vote
3
down vote
up vote
3
down vote
Actually a more correct way to define your method would be:
private static <T, U extends Comparable<? super U>> int myCompareTo(T left, T right, Function<T, U> fu)
return Comparator.comparing(fu).compare(left, right);
Actually a more correct way to define your method would be:
private static <T, U extends Comparable<? super U>> int myCompareTo(T left, T right, Function<T, U> fu)
return Comparator.comparing(fu).compare(left, right);
answered 2 days ago
Eugene
62.7k986145
62.7k986145
add a comment |Â
add a comment |Â
up vote
1
down vote
You can use
Comparator.comparing(String::length);
to obtain a comparator instance which you can pass to the method.
1
Comparator.comparing(String::length).compare("Hello1", "Hello2");
will be shorter :)
â Oleksandr
2 days ago
Of course it will. I tried to satisfy the providedmyCompareTo
interface.
â senjin.hajrulahovic
2 days ago
1
@Oleksandr should have made that an answer IMO, if you didn't I did
â Eugene
2 days ago
add a comment |Â
up vote
1
down vote
You can use
Comparator.comparing(String::length);
to obtain a comparator instance which you can pass to the method.
1
Comparator.comparing(String::length).compare("Hello1", "Hello2");
will be shorter :)
â Oleksandr
2 days ago
Of course it will. I tried to satisfy the providedmyCompareTo
interface.
â senjin.hajrulahovic
2 days ago
1
@Oleksandr should have made that an answer IMO, if you didn't I did
â Eugene
2 days ago
add a comment |Â
up vote
1
down vote
up vote
1
down vote
You can use
Comparator.comparing(String::length);
to obtain a comparator instance which you can pass to the method.
You can use
Comparator.comparing(String::length);
to obtain a comparator instance which you can pass to the method.
edited 2 days ago
answered 2 days ago
senjin.hajrulahovic
446413
446413
1
Comparator.comparing(String::length).compare("Hello1", "Hello2");
will be shorter :)
â Oleksandr
2 days ago
Of course it will. I tried to satisfy the providedmyCompareTo
interface.
â senjin.hajrulahovic
2 days ago
1
@Oleksandr should have made that an answer IMO, if you didn't I did
â Eugene
2 days ago
add a comment |Â
1
Comparator.comparing(String::length).compare("Hello1", "Hello2");
will be shorter :)
â Oleksandr
2 days ago
Of course it will. I tried to satisfy the providedmyCompareTo
interface.
â senjin.hajrulahovic
2 days ago
1
@Oleksandr should have made that an answer IMO, if you didn't I did
â Eugene
2 days ago
1
1
Comparator.comparing(String::length).compare("Hello1", "Hello2");
will be shorter :)â Oleksandr
2 days ago
Comparator.comparing(String::length).compare("Hello1", "Hello2");
will be shorter :)â Oleksandr
2 days ago
Of course it will. I tried to satisfy the provided
myCompareTo
interface.â senjin.hajrulahovic
2 days ago
Of course it will. I tried to satisfy the provided
myCompareTo
interface.â senjin.hajrulahovic
2 days ago
1
1
@Oleksandr should have made that an answer IMO, if you didn't I did
â Eugene
2 days ago
@Oleksandr should have made that an answer IMO, if you didn't I did
â Eugene
2 days ago
add a comment |Â
up vote
1
down vote
accepted
Thanks for your answers. Actually I figured it out now. I wanted to have the supplied object instances (o1 and o2) to execute the given method. I found out that Supplier was the wrong interface instead I had to use Function. Here you can see my working simplified example:
public static <T> int myCompareTo(T o1, T o2, Function<T, Comparable> getter)
return getter.apply(o1).compareTo(getter.apply(o2));
The reason, the interface has to be Function and not Supplier is, that only Function is equivalent to a lambda expression taking an object and calls the referenced method on the object.
For example, if you define the method reference as:
Function<TypeOfInstance, ReturnTypeOfReferencedMethod> methodReference = TypeOfInstance::referencedMethod();
then the equivalent lambda expression being executed is:
(instance) -> instance.referencedMethod()
Additional Information:
Edit: I know I could have done the same by using Comparator, but this example is very simplified. In my application a Function of this kind is neccessary. I had to create a compareTo function that sorts an ArrayList by more than one attribute because the main sorting attribute may not be unique in the list. I want to share my code with you, because I think it can be a interesting insight for you.
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;
With this for example, you can sort a list of persons by last name and if two of them are identical, you can use the first name to sort. With this solution you can change sorting at runtime.
New contributor
You can useComparator.thenComparing
to construct aComparator
that will take into account an arbitrary number of attributes, in order.
â László van den Hoek
yesterday
add a comment |Â
up vote
1
down vote
accepted
Thanks for your answers. Actually I figured it out now. I wanted to have the supplied object instances (o1 and o2) to execute the given method. I found out that Supplier was the wrong interface instead I had to use Function. Here you can see my working simplified example:
public static <T> int myCompareTo(T o1, T o2, Function<T, Comparable> getter)
return getter.apply(o1).compareTo(getter.apply(o2));
The reason, the interface has to be Function and not Supplier is, that only Function is equivalent to a lambda expression taking an object and calls the referenced method on the object.
For example, if you define the method reference as:
Function<TypeOfInstance, ReturnTypeOfReferencedMethod> methodReference = TypeOfInstance::referencedMethod();
then the equivalent lambda expression being executed is:
(instance) -> instance.referencedMethod()
Additional Information:
Edit: I know I could have done the same by using Comparator, but this example is very simplified. In my application a Function of this kind is neccessary. I had to create a compareTo function that sorts an ArrayList by more than one attribute because the main sorting attribute may not be unique in the list. I want to share my code with you, because I think it can be a interesting insight for you.
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;
With this for example, you can sort a list of persons by last name and if two of them are identical, you can use the first name to sort. With this solution you can change sorting at runtime.
New contributor
You can useComparator.thenComparing
to construct aComparator
that will take into account an arbitrary number of attributes, in order.
â László van den Hoek
yesterday
add a comment |Â
up vote
1
down vote
accepted
up vote
1
down vote
accepted
Thanks for your answers. Actually I figured it out now. I wanted to have the supplied object instances (o1 and o2) to execute the given method. I found out that Supplier was the wrong interface instead I had to use Function. Here you can see my working simplified example:
public static <T> int myCompareTo(T o1, T o2, Function<T, Comparable> getter)
return getter.apply(o1).compareTo(getter.apply(o2));
The reason, the interface has to be Function and not Supplier is, that only Function is equivalent to a lambda expression taking an object and calls the referenced method on the object.
For example, if you define the method reference as:
Function<TypeOfInstance, ReturnTypeOfReferencedMethod> methodReference = TypeOfInstance::referencedMethod();
then the equivalent lambda expression being executed is:
(instance) -> instance.referencedMethod()
Additional Information:
Edit: I know I could have done the same by using Comparator, but this example is very simplified. In my application a Function of this kind is neccessary. I had to create a compareTo function that sorts an ArrayList by more than one attribute because the main sorting attribute may not be unique in the list. I want to share my code with you, because I think it can be a interesting insight for you.
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;
With this for example, you can sort a list of persons by last name and if two of them are identical, you can use the first name to sort. With this solution you can change sorting at runtime.
New contributor
Thanks for your answers. Actually I figured it out now. I wanted to have the supplied object instances (o1 and o2) to execute the given method. I found out that Supplier was the wrong interface instead I had to use Function. Here you can see my working simplified example:
public static <T> int myCompareTo(T o1, T o2, Function<T, Comparable> getter)
return getter.apply(o1).compareTo(getter.apply(o2));
The reason, the interface has to be Function and not Supplier is, that only Function is equivalent to a lambda expression taking an object and calls the referenced method on the object.
For example, if you define the method reference as:
Function<TypeOfInstance, ReturnTypeOfReferencedMethod> methodReference = TypeOfInstance::referencedMethod();
then the equivalent lambda expression being executed is:
(instance) -> instance.referencedMethod()
Additional Information:
Edit: I know I could have done the same by using Comparator, but this example is very simplified. In my application a Function of this kind is neccessary. I had to create a compareTo function that sorts an ArrayList by more than one attribute because the main sorting attribute may not be unique in the list. I want to share my code with you, because I think it can be a interesting insight for you.
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;
With this for example, you can sort a list of persons by last name and if two of them are identical, you can use the first name to sort. With this solution you can change sorting at runtime.
New contributor
edited 2 days ago
New contributor
answered 2 days ago
Philipp NiedergesäÃ
648
648
New contributor
New contributor
You can useComparator.thenComparing
to construct aComparator
that will take into account an arbitrary number of attributes, in order.
â László van den Hoek
yesterday
add a comment |Â
You can useComparator.thenComparing
to construct aComparator
that will take into account an arbitrary number of attributes, in order.
â László van den Hoek
yesterday
You can use
Comparator.thenComparing
to construct a Comparator
that will take into account an arbitrary number of attributes, in order.â László van den Hoek
yesterday
You can use
Comparator.thenComparing
to construct a Comparator
that will take into account an arbitrary number of attributes, in order.â László van den Hoek
yesterday
add a comment |Â
Philipp Niedergesäà is a new contributor. Be nice, and check out our Code of Conduct.
Philipp Niedergesäà is a new contributor. Be nice, and check out our Code of Conduct.
Philipp Niedergesäà is a new contributor. Be nice, and check out our Code of Conduct.
Philipp Niedergesäà is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f52682507%2fhow-to-bind-a-java-supplier-to-an-instance-of-an-object%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
btw you could accept an answer here....
â Eugene
15 hours ago