Passing a generic function as parameter
Clash Royale CLAN TAG#URR8PPP
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty margin-bottom:0;
up vote
2
down vote
favorite
Ran into this idea and I'm curious if it's possible.
I'm trying to make a single function that can test ALL of my sorting algorithms dynamically. I want to be able to pass the sorting function as a parameter and the algorithm will use the sorting function with it's own dynamic parameters. This is an example of what I'm trying to do:
class manyFunctions
int mergeSort(int myArray)
...work here;
return sortedArray;
int otherSort(int myArray)
...work here;
return sortedArray;
class mainClass{
public static void main(StringArgs)
test(manyFunctions.mergeSort);
test(manyFunctions.otherSort);
boolean test(function someSortFunction)
int n; // number of trials
for (int i=0; i<=n ; i++)
int A = generateArray() // another function I made
if (isSorted(someSortFunction(A)) = false)
return false;
return true;
I can't figure out how to do this with the little bit I know about lambda expressions and function pointers. If it's possible, this technique would come in handy.
java functional-programming
add a comment |Â
up vote
2
down vote
favorite
Ran into this idea and I'm curious if it's possible.
I'm trying to make a single function that can test ALL of my sorting algorithms dynamically. I want to be able to pass the sorting function as a parameter and the algorithm will use the sorting function with it's own dynamic parameters. This is an example of what I'm trying to do:
class manyFunctions
int mergeSort(int myArray)
...work here;
return sortedArray;
int otherSort(int myArray)
...work here;
return sortedArray;
class mainClass{
public static void main(StringArgs)
test(manyFunctions.mergeSort);
test(manyFunctions.otherSort);
boolean test(function someSortFunction)
int n; // number of trials
for (int i=0; i<=n ; i++)
int A = generateArray() // another function I made
if (isSorted(someSortFunction(A)) = false)
return false;
return true;
I can't figure out how to do this with the little bit I know about lambda expressions and function pointers. If it's possible, this technique would come in handy.
java functional-programming
add a comment |Â
up vote
2
down vote
favorite
up vote
2
down vote
favorite
Ran into this idea and I'm curious if it's possible.
I'm trying to make a single function that can test ALL of my sorting algorithms dynamically. I want to be able to pass the sorting function as a parameter and the algorithm will use the sorting function with it's own dynamic parameters. This is an example of what I'm trying to do:
class manyFunctions
int mergeSort(int myArray)
...work here;
return sortedArray;
int otherSort(int myArray)
...work here;
return sortedArray;
class mainClass{
public static void main(StringArgs)
test(manyFunctions.mergeSort);
test(manyFunctions.otherSort);
boolean test(function someSortFunction)
int n; // number of trials
for (int i=0; i<=n ; i++)
int A = generateArray() // another function I made
if (isSorted(someSortFunction(A)) = false)
return false;
return true;
I can't figure out how to do this with the little bit I know about lambda expressions and function pointers. If it's possible, this technique would come in handy.
java functional-programming
Ran into this idea and I'm curious if it's possible.
I'm trying to make a single function that can test ALL of my sorting algorithms dynamically. I want to be able to pass the sorting function as a parameter and the algorithm will use the sorting function with it's own dynamic parameters. This is an example of what I'm trying to do:
class manyFunctions
int mergeSort(int myArray)
...work here;
return sortedArray;
int otherSort(int myArray)
...work here;
return sortedArray;
class mainClass{
public static void main(StringArgs)
test(manyFunctions.mergeSort);
test(manyFunctions.otherSort);
boolean test(function someSortFunction)
int n; // number of trials
for (int i=0; i<=n ; i++)
int A = generateArray() // another function I made
if (isSorted(someSortFunction(A)) = false)
return false;
return true;
I can't figure out how to do this with the little bit I know about lambda expressions and function pointers. If it's possible, this technique would come in handy.
java functional-programming
edited Feb 7 at 10:08
Zoe
20519
20519
asked Feb 7 at 7:13
HippoMano
1314
1314
add a comment |Â
add a comment |Â
1 Answer
1
active
oldest
votes
up vote
3
down vote
accepted
Note: This answer is based on Java 8 and newer. This does not apply to Java 7, as Java 7 does not support Lambda
For starters, your test function is wrong in multiple places:
boolean test(function someSortFunction)//This is not how you pass functions
int n; //this has to be initialized
for (int i=0; i<=n ; i++) //Depending on how n is used, you may have to use < instead of <=
int A = generateArray()//Missing semi-colon
if (isSorted(someSortFunction(A)) = false) //Comparing is done with ==, not =
return false;
return true;
In order to pass a function, you can either use Consumer<Void>
, Supplier<Void>
, Predicate<Void>
or Function<Void, Void>
(don't use Void
as the type if you have return values)
Supplier defines return type, Consumer defines input type, and function both. Meaning:
- Use Predicate when you have a boolean return type with arguments
- Use Supplier when you have a return type
- Use Consumer when you have an argument
- Use Function when you have both an argument and a return value
Since you have both arguments and return types, use Function
. The first argument you give it is the argument it receives, and the second is the return type. For an instance, in your case, this would be:
boolean test(Function<int, int> someFunction)
Using Function
requires calling apply
to execute the method:
int res = someFunction.apply(input);
Before I move on, I'd like to take a second to mention naming conventions. In Java, class names always start with an upper case letter. Instances and functions start with a lower case letter. So your classes would be:
public class ManyFunctions ...
public class MainClass ...
Passing methods are not done using someClass.someFunction
. In your case, since you are not using static methods, you need to create an instance:
ManyFunctions functions = new ManyFunctions();
now, you pass the functions:
test(functions::mergeSort);
if you make the methods static, you can just skip the instance and use the class name directly:
test(ManyFunctions::mergeSort);
So your class would be:
class MainClass
public static void main(String args)
ManyFunctions manyFunctions = new ManyFunctions();
test(manyFunctions::mergeSort);//Notice the missing "()" and arguments
test(manyFunctions::otherSort);
boolean test(Function<int, int> someSortFunction)
int n = 10;//THIS HAS TO BE INITIALIZED! Otherwise, it won't compile
for (int i=0; i<=n ; i++)
int A = generateArray();
if (isSorted(someSortFunction.apply(A)) == false) //comparing is done with ==
return false;
return true;
//Don't know if it was a copy-paste problem or not, but you had a missing bracket
when the return type is boolean then the functional interface should bePredicate
â Sharon Ben Asher
Feb 7 at 9:36
I was looking attest()
method itself
â Sharon Ben Asher
Feb 7 at 9:47
There are no methods being passed as arguments with a boolean return type in OP's code though (had to post a new comment, was too late to edit the previous one)
â Zoe
Feb 7 at 9:47
@SharonBenAshertest()
is never passed anywhere. The only methods being passed haveint
return types
â Zoe
Feb 7 at 9:49
1
I apologize that, by trying to simplify my question/code, I made some distracting mistakes. The meat of the question is there though and your answer is really helpful and interesting! Thank you!
â HippoMano
Feb 7 at 19:39
add a comment |Â
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
3
down vote
accepted
Note: This answer is based on Java 8 and newer. This does not apply to Java 7, as Java 7 does not support Lambda
For starters, your test function is wrong in multiple places:
boolean test(function someSortFunction)//This is not how you pass functions
int n; //this has to be initialized
for (int i=0; i<=n ; i++) //Depending on how n is used, you may have to use < instead of <=
int A = generateArray()//Missing semi-colon
if (isSorted(someSortFunction(A)) = false) //Comparing is done with ==, not =
return false;
return true;
In order to pass a function, you can either use Consumer<Void>
, Supplier<Void>
, Predicate<Void>
or Function<Void, Void>
(don't use Void
as the type if you have return values)
Supplier defines return type, Consumer defines input type, and function both. Meaning:
- Use Predicate when you have a boolean return type with arguments
- Use Supplier when you have a return type
- Use Consumer when you have an argument
- Use Function when you have both an argument and a return value
Since you have both arguments and return types, use Function
. The first argument you give it is the argument it receives, and the second is the return type. For an instance, in your case, this would be:
boolean test(Function<int, int> someFunction)
Using Function
requires calling apply
to execute the method:
int res = someFunction.apply(input);
Before I move on, I'd like to take a second to mention naming conventions. In Java, class names always start with an upper case letter. Instances and functions start with a lower case letter. So your classes would be:
public class ManyFunctions ...
public class MainClass ...
Passing methods are not done using someClass.someFunction
. In your case, since you are not using static methods, you need to create an instance:
ManyFunctions functions = new ManyFunctions();
now, you pass the functions:
test(functions::mergeSort);
if you make the methods static, you can just skip the instance and use the class name directly:
test(ManyFunctions::mergeSort);
So your class would be:
class MainClass
public static void main(String args)
ManyFunctions manyFunctions = new ManyFunctions();
test(manyFunctions::mergeSort);//Notice the missing "()" and arguments
test(manyFunctions::otherSort);
boolean test(Function<int, int> someSortFunction)
int n = 10;//THIS HAS TO BE INITIALIZED! Otherwise, it won't compile
for (int i=0; i<=n ; i++)
int A = generateArray();
if (isSorted(someSortFunction.apply(A)) == false) //comparing is done with ==
return false;
return true;
//Don't know if it was a copy-paste problem or not, but you had a missing bracket
when the return type is boolean then the functional interface should bePredicate
â Sharon Ben Asher
Feb 7 at 9:36
I was looking attest()
method itself
â Sharon Ben Asher
Feb 7 at 9:47
There are no methods being passed as arguments with a boolean return type in OP's code though (had to post a new comment, was too late to edit the previous one)
â Zoe
Feb 7 at 9:47
@SharonBenAshertest()
is never passed anywhere. The only methods being passed haveint
return types
â Zoe
Feb 7 at 9:49
1
I apologize that, by trying to simplify my question/code, I made some distracting mistakes. The meat of the question is there though and your answer is really helpful and interesting! Thank you!
â HippoMano
Feb 7 at 19:39
add a comment |Â
up vote
3
down vote
accepted
Note: This answer is based on Java 8 and newer. This does not apply to Java 7, as Java 7 does not support Lambda
For starters, your test function is wrong in multiple places:
boolean test(function someSortFunction)//This is not how you pass functions
int n; //this has to be initialized
for (int i=0; i<=n ; i++) //Depending on how n is used, you may have to use < instead of <=
int A = generateArray()//Missing semi-colon
if (isSorted(someSortFunction(A)) = false) //Comparing is done with ==, not =
return false;
return true;
In order to pass a function, you can either use Consumer<Void>
, Supplier<Void>
, Predicate<Void>
or Function<Void, Void>
(don't use Void
as the type if you have return values)
Supplier defines return type, Consumer defines input type, and function both. Meaning:
- Use Predicate when you have a boolean return type with arguments
- Use Supplier when you have a return type
- Use Consumer when you have an argument
- Use Function when you have both an argument and a return value
Since you have both arguments and return types, use Function
. The first argument you give it is the argument it receives, and the second is the return type. For an instance, in your case, this would be:
boolean test(Function<int, int> someFunction)
Using Function
requires calling apply
to execute the method:
int res = someFunction.apply(input);
Before I move on, I'd like to take a second to mention naming conventions. In Java, class names always start with an upper case letter. Instances and functions start with a lower case letter. So your classes would be:
public class ManyFunctions ...
public class MainClass ...
Passing methods are not done using someClass.someFunction
. In your case, since you are not using static methods, you need to create an instance:
ManyFunctions functions = new ManyFunctions();
now, you pass the functions:
test(functions::mergeSort);
if you make the methods static, you can just skip the instance and use the class name directly:
test(ManyFunctions::mergeSort);
So your class would be:
class MainClass
public static void main(String args)
ManyFunctions manyFunctions = new ManyFunctions();
test(manyFunctions::mergeSort);//Notice the missing "()" and arguments
test(manyFunctions::otherSort);
boolean test(Function<int, int> someSortFunction)
int n = 10;//THIS HAS TO BE INITIALIZED! Otherwise, it won't compile
for (int i=0; i<=n ; i++)
int A = generateArray();
if (isSorted(someSortFunction.apply(A)) == false) //comparing is done with ==
return false;
return true;
//Don't know if it was a copy-paste problem or not, but you had a missing bracket
when the return type is boolean then the functional interface should bePredicate
â Sharon Ben Asher
Feb 7 at 9:36
I was looking attest()
method itself
â Sharon Ben Asher
Feb 7 at 9:47
There are no methods being passed as arguments with a boolean return type in OP's code though (had to post a new comment, was too late to edit the previous one)
â Zoe
Feb 7 at 9:47
@SharonBenAshertest()
is never passed anywhere. The only methods being passed haveint
return types
â Zoe
Feb 7 at 9:49
1
I apologize that, by trying to simplify my question/code, I made some distracting mistakes. The meat of the question is there though and your answer is really helpful and interesting! Thank you!
â HippoMano
Feb 7 at 19:39
add a comment |Â
up vote
3
down vote
accepted
up vote
3
down vote
accepted
Note: This answer is based on Java 8 and newer. This does not apply to Java 7, as Java 7 does not support Lambda
For starters, your test function is wrong in multiple places:
boolean test(function someSortFunction)//This is not how you pass functions
int n; //this has to be initialized
for (int i=0; i<=n ; i++) //Depending on how n is used, you may have to use < instead of <=
int A = generateArray()//Missing semi-colon
if (isSorted(someSortFunction(A)) = false) //Comparing is done with ==, not =
return false;
return true;
In order to pass a function, you can either use Consumer<Void>
, Supplier<Void>
, Predicate<Void>
or Function<Void, Void>
(don't use Void
as the type if you have return values)
Supplier defines return type, Consumer defines input type, and function both. Meaning:
- Use Predicate when you have a boolean return type with arguments
- Use Supplier when you have a return type
- Use Consumer when you have an argument
- Use Function when you have both an argument and a return value
Since you have both arguments and return types, use Function
. The first argument you give it is the argument it receives, and the second is the return type. For an instance, in your case, this would be:
boolean test(Function<int, int> someFunction)
Using Function
requires calling apply
to execute the method:
int res = someFunction.apply(input);
Before I move on, I'd like to take a second to mention naming conventions. In Java, class names always start with an upper case letter. Instances and functions start with a lower case letter. So your classes would be:
public class ManyFunctions ...
public class MainClass ...
Passing methods are not done using someClass.someFunction
. In your case, since you are not using static methods, you need to create an instance:
ManyFunctions functions = new ManyFunctions();
now, you pass the functions:
test(functions::mergeSort);
if you make the methods static, you can just skip the instance and use the class name directly:
test(ManyFunctions::mergeSort);
So your class would be:
class MainClass
public static void main(String args)
ManyFunctions manyFunctions = new ManyFunctions();
test(manyFunctions::mergeSort);//Notice the missing "()" and arguments
test(manyFunctions::otherSort);
boolean test(Function<int, int> someSortFunction)
int n = 10;//THIS HAS TO BE INITIALIZED! Otherwise, it won't compile
for (int i=0; i<=n ; i++)
int A = generateArray();
if (isSorted(someSortFunction.apply(A)) == false) //comparing is done with ==
return false;
return true;
//Don't know if it was a copy-paste problem or not, but you had a missing bracket
Note: This answer is based on Java 8 and newer. This does not apply to Java 7, as Java 7 does not support Lambda
For starters, your test function is wrong in multiple places:
boolean test(function someSortFunction)//This is not how you pass functions
int n; //this has to be initialized
for (int i=0; i<=n ; i++) //Depending on how n is used, you may have to use < instead of <=
int A = generateArray()//Missing semi-colon
if (isSorted(someSortFunction(A)) = false) //Comparing is done with ==, not =
return false;
return true;
In order to pass a function, you can either use Consumer<Void>
, Supplier<Void>
, Predicate<Void>
or Function<Void, Void>
(don't use Void
as the type if you have return values)
Supplier defines return type, Consumer defines input type, and function both. Meaning:
- Use Predicate when you have a boolean return type with arguments
- Use Supplier when you have a return type
- Use Consumer when you have an argument
- Use Function when you have both an argument and a return value
Since you have both arguments and return types, use Function
. The first argument you give it is the argument it receives, and the second is the return type. For an instance, in your case, this would be:
boolean test(Function<int, int> someFunction)
Using Function
requires calling apply
to execute the method:
int res = someFunction.apply(input);
Before I move on, I'd like to take a second to mention naming conventions. In Java, class names always start with an upper case letter. Instances and functions start with a lower case letter. So your classes would be:
public class ManyFunctions ...
public class MainClass ...
Passing methods are not done using someClass.someFunction
. In your case, since you are not using static methods, you need to create an instance:
ManyFunctions functions = new ManyFunctions();
now, you pass the functions:
test(functions::mergeSort);
if you make the methods static, you can just skip the instance and use the class name directly:
test(ManyFunctions::mergeSort);
So your class would be:
class MainClass
public static void main(String args)
ManyFunctions manyFunctions = new ManyFunctions();
test(manyFunctions::mergeSort);//Notice the missing "()" and arguments
test(manyFunctions::otherSort);
boolean test(Function<int, int> someSortFunction)
int n = 10;//THIS HAS TO BE INITIALIZED! Otherwise, it won't compile
for (int i=0; i<=n ; i++)
int A = generateArray();
if (isSorted(someSortFunction.apply(A)) == false) //comparing is done with ==
return false;
return true;
//Don't know if it was a copy-paste problem or not, but you had a missing bracket
edited Apr 22 at 8:27
Billal BEGUERADJ
1
1
answered Feb 7 at 8:17
Zoe
20519
20519
when the return type is boolean then the functional interface should bePredicate
â Sharon Ben Asher
Feb 7 at 9:36
I was looking attest()
method itself
â Sharon Ben Asher
Feb 7 at 9:47
There are no methods being passed as arguments with a boolean return type in OP's code though (had to post a new comment, was too late to edit the previous one)
â Zoe
Feb 7 at 9:47
@SharonBenAshertest()
is never passed anywhere. The only methods being passed haveint
return types
â Zoe
Feb 7 at 9:49
1
I apologize that, by trying to simplify my question/code, I made some distracting mistakes. The meat of the question is there though and your answer is really helpful and interesting! Thank you!
â HippoMano
Feb 7 at 19:39
add a comment |Â
when the return type is boolean then the functional interface should bePredicate
â Sharon Ben Asher
Feb 7 at 9:36
I was looking attest()
method itself
â Sharon Ben Asher
Feb 7 at 9:47
There are no methods being passed as arguments with a boolean return type in OP's code though (had to post a new comment, was too late to edit the previous one)
â Zoe
Feb 7 at 9:47
@SharonBenAshertest()
is never passed anywhere. The only methods being passed haveint
return types
â Zoe
Feb 7 at 9:49
1
I apologize that, by trying to simplify my question/code, I made some distracting mistakes. The meat of the question is there though and your answer is really helpful and interesting! Thank you!
â HippoMano
Feb 7 at 19:39
when the return type is boolean then the functional interface should be
Predicate
â Sharon Ben Asher
Feb 7 at 9:36
when the return type is boolean then the functional interface should be
Predicate
â Sharon Ben Asher
Feb 7 at 9:36
I was looking at
test()
method itselfâ Sharon Ben Asher
Feb 7 at 9:47
I was looking at
test()
method itselfâ Sharon Ben Asher
Feb 7 at 9:47
There are no methods being passed as arguments with a boolean return type in OP's code though (had to post a new comment, was too late to edit the previous one)
â Zoe
Feb 7 at 9:47
There are no methods being passed as arguments with a boolean return type in OP's code though (had to post a new comment, was too late to edit the previous one)
â Zoe
Feb 7 at 9:47
@SharonBenAsher
test()
is never passed anywhere. The only methods being passed have int
return typesâ Zoe
Feb 7 at 9:49
@SharonBenAsher
test()
is never passed anywhere. The only methods being passed have int
return typesâ Zoe
Feb 7 at 9:49
1
1
I apologize that, by trying to simplify my question/code, I made some distracting mistakes. The meat of the question is there though and your answer is really helpful and interesting! Thank you!
â HippoMano
Feb 7 at 19:39
I apologize that, by trying to simplify my question/code, I made some distracting mistakes. The meat of the question is there though and your answer is really helpful and interesting! Thank you!
â HippoMano
Feb 7 at 19:39
add a comment |Â
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%2fcodereview.stackexchange.com%2fquestions%2f186972%2fpassing-a-generic-function-as-parameter%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