JDK8新特性函数式接口的使用示例

本文介绍JDK8的重要更新,如Lambda表达式、函数式接口等,并通过一个具体的文件读取示例来展示如何利用函数式接口进行高效且灵活的编程。

JDK8推出了很多新特性,比如:

基础知识

在写函数式接口的使用示例之前,先了解如下几个知识:

  • 行为参数化:
    是JDK8提出的,函数式编程的一种思想,把代码逻辑包装为一个参数传到方法里。

  • Lambda表达式:
    是JDK8提出的,可以理解为简洁的表示可传递的匿名函数的一种方式,它没有名称,但它有参数列表、函数体、返回类型,可以抛出一个异常类型。

  • 函数式接口:
    本质上是只有一个抽象方法的普通接口,可以被隐式的转换为Lambda表达式,需要用@FunctionalInterface注解定义。JDK8默认方法和静态方法可以在函数式接口中定义。如果函数式接口中额外定义多个抽象方法,那么这些抽象方法签名必须和Object的public方法一样,接口最终有确定的类实现, 而类的最终父类是Object。因此函数式接口可以定义Object的public方法。

在这里插入图片描述

  • try(){} 自动关闭流,1.7支持

代码示例:文本文件内容 -> String

文本文件内容读取输出String字符串。
大概流程:字节流 -> 字符流 -> 字符缓冲流,会经过几次IO流的封装、IO流转换、IO流关闭和异常捕获,很繁琐。
下面我们通过函数式接口做一下封装,把前面步骤封装起来,留最后一步缓冲流读取为字符串的步骤给用户自己扩展,比如包装成自己想要的字符串格式等待。具体代码示例下入:


定义函数式接口:

/**
 * TODO
 *
 * @author wanglingqiang
 * @date 2020/10/10 下午6:54
 */
@FunctionalInterface
public interface BufferProcess {

    String process(BufferedReader bufferedReader) throws IOException;

}

通用业务处理方法(为了方便测试写成static):

public static String fileToBufferReader(BufferProcess bufferProcess, File file) {
    String result = null;
    try (FileInputStream fis = new FileInputStream(file)) {
        try (InputStreamReader isr = new InputStreamReader(fis)) {
            try (BufferedReader br = new BufferedReader(isr)) {
                result = bufferProcess.process(br);
            }
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        return result;
    }
}

调用通用业务处理方法(为了方便测试写成static):

public static String readFileToString(File file){
   return fileToBufferReader((bufferedReader) -> {
       String str = null;
       StringBuilder sb = new StringBuilder();
       while ((str = bufferedReader.readLine()) != null) {
           sb.append(str);
       }
       return sb.toString();
   }, file);
}

测试:

public static void main(String[] args) {

   File file = new File("/Users/wanglingqiang/Documents/mp.log");
   String result = readFileToString(file);
   System.out.println(result);
}

输出结果:

[3813] 07-06 14:50:23 DEBUG []************* start a new one **************

正常读取了log日志的内容。


上面的代码示例,利用函数式接口实现了封装不变的,提取变化的,有单一职责的思想,也有策略模式的思想。在实际工作中我也有使用函数式接口,除了示例中的思想,还用了它延时执行的特性。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值