刘盾 原创文章 于 2022-09-24
先抛出一个问题:
Java中可以像JavaScript那样,把一个函数直接当做参数来传递吗?
从Java 8开始,是可以的。在Java提供的函数式编程接口中,Function<T,R>接口的作用的是用来表现一个参数类型为T、返回值类型为R的函数(方法)。下面,以加密功能举例,实现Java中把函数作为参数进行传递的效果。
1.声明方法
首先,我们来声明一个参数类型为函数的文本加密方法。该方法从控制台接收输入的字符串,调用传入的加密函数进行加密,并返回。
注意这个方法的参数,是Function<String,String>,说明可以传入的参数是一个函数,函数的参数是String,返回值也是String类型。
/**
* 对控制台文本进行加密的方法
* @param signer 传入的加密函数
* @return 加密之后的密文
*/
protected static String sign(Function<String, String> signer) {
System.out.println("请输入要加密的字串:");
String str = new Scanner(System.in).next();
return signer.apply(str);
}
2.调用方法并传入一个函数(方式1)
声明一个基于MD5算法的加密函数md5Sign,在main方法中调用sign方法并传入这个加密函数。
/**
* md5加密函数
* @param signStr 要加密的明文
* @return 加密后的密文
*/
protected static String md5Sign(String signStr) {
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("md5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return new String(md5.digest(signStr.getBytes()));
}
public static void main(String[] args)throws Exception {
String result = sign(FunctionTest::md5Sign);
System.out.println("加密后:"+result);
}
3.调用方法并传入一个函数(方式2)
上面的方式把要传入的函数单独进行了声明,但是如果代码不多,可以省略声明,而是在调用的时候直接传入,这种语法叫Lambda表达式。Lambda表达式也可以看做是一种匿名函数。
Lambda表达式分为三个部分:(形参) -> {函数体代码},整个表达式其实就是一个函数。第一部分,形参如果只有一个,()可以省略;第二部分是一个箭头,是固定要写的;第三部分是代码,如果代码只有一行,{}可以省略。
public static void main(String[] args){
String result = sign(str -> {
//Lambda表达式从从str -> 这里开始
try {
return new String(MessageDigest.getInstance("md5").digest(str.getBytes()));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}); //Lambda表达式在}这里结束
System.out.println("加密后:"+result);
}