这里须要把稳一点默认方法和静态方法虽然不属于抽象方法,但是可以在函数式接口中定义。
@FunctionalInterfacepublicinterface ObjectMethodFunctionalInterface {void count(int i);String toString(); //same to Object.toStringint hashCode(); //same to Object.hashCodeboolean equals(Object obj); //same to Object.equals}
如果函数式接口中额外定义多个抽象方法,那么这些抽象方法署名必须和Object的public方法一样,接口终极有确定的类实现, 而类的终极父类是Object。 因此函数式接口可以定义Object的public方法。
即行为参数化是辅导思想,Lambda表达式是表达办法,函数式接口是实现手腕

Class<?> clazz = Class.forName("类名");
这句代码想来小伙伴都不陌生。这是一个受检非常,须要抛出一个ClassNotFoundException。
正常的写法:try { Class<?> clazzOld = Class.forName("类名"); } catch (ClassNotFoundException e) { e.printStackTrace(); }
隐蔽之后的写法:
Class<?> clazzNew =classFind( o -> Class.forName(o),"类名");
嗯,我们来看详细的实现:很大略,我们要做的,即把Class<?> clazz = Class.forName("类名");当做一种行为去处理,接管一个String ,得到一个Class,以是我们要定义一个函数接口,描述这种行为,这种行为本身是须要处理受检非常的。
/ @Auther: Liruilong @Date: 2020/7/29 15:50 @Description: 由函数名获取元类Class实例 函数署名: String ==> Class /@FunctionalInterfacepublic interface ClassFindInterface { Class<?> classNametoClass(String className)throws ClassNotFoundException;}
这里,由于我们的行为须要抛出非常。以是在接口里也抛出非常。
然后,我们须要定义一个方法,将我们的行为作为参数传进去,同时,捕获一下我们的非常。
public Class classFind(ClassFindInterface classFindInterface,String className){ Class<?> clazz =null; try { clazz = classFindInterface.classNametoClass(className); } catch (ClassNotFoundException e) { logger4j.error("˙·...·˙`˙·....·…┉═∞═…┉ ═∞═┈━═┈━═┈━═┈━═┈━═☆☆☆☆、"+e.getMessage()+"☆☆☆☆☆☆☆☆☆"); e.printStackTrace(); } return clazz; }
然后,我们可以调用我们的方法classFind方法,
Class<?> clazzNew =classFind( o -> Class.forName(o),"类名");
当然。实在这种思想并不大略的可以做捕获非常的处理,
我们来看一个Demo文本文件转换为字符串:
在我看来;将文本文件转换为字符串,我们须要利用高等流包装低级流,然后做缓存读出来。这里,我们不可避免的会碰着非常处理,流的关闭等操作,下面我们将这些代码都非常起来。专心写读的逻辑即可。
我的思路:我对java IO用的不是很熟,大家有好的方法请留言,相互学习:
FileInputStream fileInputStream = new FileInputStream(file))InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream))BufferedReader bufferedReader = new BufferedReader(inputStreamReader))String str = bufferedReader.readLine()
字节流-》字符流-》字符缓存流 即 将字节流转换为字符流之后在用高等流包装。
以是我的思路是避免在逻辑里涌现太多的IO流关闭,和非常捕获,专心处理读取逻辑即可,结合以下两种技能:
try(){}【自动关闭流,1.7支持】lambda特性来实现【行为参数化,1.8】描述一个行为,BufferReader -> String
package com.liruilong.demotext.service.utils.interfaceutils; import java.io.BufferedReader;import java.io.IOException; / @Description : 函数接口,描述BufferedReader ->String的转化办法 @Author: Liruilong @Date: 2020/3/17 15:44 /@FunctionalInterfacepublic interface InputStreamPeocess { / @Author Liruilong @Description 方法署名 BufferedReader ->String @Date 15:47 2020/3/17 @Param [inputStream] @return com.liruilong.demotext.service.utils.InputStream / String peocess(BufferedReader bufferedReader) throws IOException;}
执一个行为,嵌入到定式里,任何BufferReader -> String的Lambda表达式都可以作为参数传入。只要符合peocess方法的署名即可。
/ @return java.lang.String @Author Liruilong @Description 环抱处理 @Date 17:14 2020/3/17 @Param [inputStreamPeocess, file] / public static String fileToBufferedReader(InputStreamPeocess inputStreamPeocess, File file) { string resoult= null; try (FileInputStream fileInputStream = new FileInputStream(file)) { try (InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream)) { try (BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) { resoult = inputStreamPeocess.peocess(bufferedReader); } } } catch (IOException e) { e.printStackTrace(); } finally { return resoult ; } }
如何利用这个定义好的行为
/ @return java.lang.String @Author Liruilong @Description 文件转字符串 @Date 17:22 2020/3/17 @Param [file] / public static String readJsonToString(File file) { return fileToBufferedReader((bufferedReader) -> { String str = null; StringBuilder stringBuilder = new StringBuilder(); while ((str = bufferedReader.readLine()) != null) { stringBuilder.append(str); } return stringBuilder.toString(); }, file); }
关于Java中try{}catch的隐蔽就和小伙伴分享到这里