This is how you would create a function that takes a function as argument in Java
import java.util.function.Function;
class Scratch {
public static void doCallFunc(int num, Function<Integer,String> fn) {
System.out.println( "Result : "+fn.apply( num ) );
}
public static void main(String[] args) {
Function<Integer,String> myFunc = num -> "Value = " + num;
System.out.println( myFunc.apply( 7 ) );
}
}
The Function<A,B> myFunc = num -> “Value = ” + num;
Here :
A = the type of the first argument, in this example an interger
B = the type of the result/returned value, in this exampel a String
And for multiple parameters you need to create an interface like this
import java.util.function.Function;
@FunctionalInterface
interface TwoParamFunction<A,B,C> {
public C apply(A a, B b);
}
class Scratch {
public static void doCallFunc2(int num, TwoParamFunction<Integer,String,String> fn) {
System.out.println( "Result : "+fn.apply( num, "Value" ) );
}
public static void main(String[] args) {
TwoParamFunction<Integer,String,String> myFunc2 = (num,str) -> str + " : " + num;
doCallFunc2( 7, myFunc2 );
}
}
Now with TWO (2) parameters instead, it looks looks alot more complicated.
TwoParamFunction<A,B,C>
A = is the type of the first parameter
B = is the type of the second parameter
C = is the type of the resule/returned value
If we look at Scala the code looks alot simpler and much more intuitive
def myFunc( num:Int ):String = {
"Value = " + num
}
def doCallFunc( num:Int, fn:(Int)=>String ):Unit = {
println("Result :"+fn(num))
}
doCallFunc(123,myFunc)
here the definition of the function
fn:(Int)=>String
clearly spells out that the first argument is an Int and the return type is a String.
And if we in Scala would have 2 or more arguments you have probably already guessed it
def myFunc2( num:Int, str:String ):String = {
str + num
}
def doCallFunc2( num:Int, fn:(Int,String)=>String ):Unit = {
println("Result :"+fn(num,"Value = "))
}
doCallFunc2( 123, myFunc2 )
For functions as arguments/parameters example above, then Scala wins all week !
Over and out !