Java函数式编程入门之Function<T,R>接口

刘盾 原创文章 于 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);
}

猜你喜欢

转载自blog.csdn.net/liudun_cool/article/details/127028259