Java函数式编程入门之Function<T,R>接口
先抛出一个问题: 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); }