JDK8推出了很多新特性,比如:
- 函数式接口
- Lambda表达式
- Stream API流式计算 JDK8语法糖stream()流式计算的使用例子
- 接口中的默认方法与静态方法
- 方法引用与构造器引用
- 新日期API JDK8日期时间类型LocalDateTime、LocalDate、LocalTime使用例子
基础知识
在写函数式接口的使用示例之前,先了解如下几个知识:
-
行为参数化:
是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日志的内容。
上面的代码示例,利用函数式接口实现了封装不变的,提取变化的,有单一职责的思想,也有策略模式的思想。在实际工作中我也有使用函数式接口,除了示例中的思想,还用了它延时执行的特性。

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

被折叠的 条评论
为什么被折叠?



