网站首页 > java教程 正文
在开发过程中经常会使用if...else...进行判断抛出异常、分支处理等操作。这些if...else...充斥在代码中严重影响了代码代码的美观,这时我们可以利用Java 8的Function接口来消灭if...else...
if (...){
throw new RuntimeException("发生异常了");
}
//举例
if (...){
doSomething();
} else {
doOther();
}
Function 函数式接口
使用注解@FunctionalInterface标识,并且只包含一个抽象方法的接口是函数式接口。函数式接口主要分为Supplier供给型函数、Consumer消费型函数、Runnable无参无返回型函数和Function有参有返回型函数。
提供自定义的函数进行转化
Function<String, Long> fun = x -> DateUtil.parse(x.replaceAll("/", "-"), "yyyy-MM-dd").getTime() / 1000;
//提供传入的时间格式的字符串
fun.apply(param);
Function可以看作转换型函数
Supplier供给型函数
Supplier的表现形式为不接受参数、只返回数据
/**
*表示结果的提供者。
*<p>不要求每次返回一个新的或不同的结果
*调用供应商的时间。
*<p>这是一个<a href=“package summary.html”>功能界面</a>
*其函数方法为{@link#get()}。
*@param<T>此供应商提供的结果类型
*@自1.8起
*/
@FunctionalInterface
public interface Supplier<T> {
/**
*获取结果。
*@return a结果
*/
T get();
}
- 测试代码:
public static void main(String[] args){
//创建Supplier容器,声明为UserLog类型,此时并不会调用对象的构造方法,即不会创建对象
Supplier<UserLog> sup=UserLog::new;
//调用get()方法,此时会调用对象的构造方法,即获得到真正对象
UserLog userLog=sup.get();
userLog.setId(1);
System.out.println(userLog);
//每次get都会调用构造方法,即获取的对象不同
System.out.println(sup.get());
}
- 输出结果
Consumer消费型函数
Consumer消费型函数和Supplier刚好相反。Consumer接收一个参数,没有返回值
/**
*表示接受单个输入参数并返回no的操作
*结果。与大多数其他功能接口不同,需要{@codeConsumer}
*通过副作用进行操作。
*<p>这是一个<a href=“package summary.html”>功能界面</a>
*其函数方法为{@link#accept(Object)}。
*@param<T>操作的输入类型
*@自1.8起
*/
@FunctionalInterface
public interface Consumer<T> {
/**
*对给定参数执行此操作。
*@param t输入参数
*/
void accept(T t);
/**
*返回按顺序执行以下操作的组合{@code Consumer}
*操作后跟{@code-after}操作。如果执行以下任一操作
*操作抛出异常,它被中继到
*组合操作。如果执行此操作会引发异常,
*不会执行{@code-after}操作。
*@param在操作后执行此操作后
*@return一个按顺序执行此操作的组合{@code消费者}
*操作后跟{@code-after}操作
*如果{@code-after}为空,@throws NullPointerException
*/
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
例子:
Consumer<String> nameConsumer = s -> System.out.println(s);
nameConsumer.accept("张三");
nameConsumer.accept("李四");
System.out.println("===================");
List<Integer> numList = Arrays.asList(1, 2, 3, 4);
Consumer<List<Integer>> squareConsumer = list -> {
for (int i = 0; i < list.size(); i++) {
list.set(i, list.get(i) * list.get(i));
}
};
Consumer<List<Integer>> printConsumer = list -> list.forEach(n -> System.out.println(n));
squareConsumer.andThen(printConsumer).accept(numList);
输出结果:
使用小技巧
处理抛出异常的if
/**
* 抛异常接口
* 定义一个抛出异常的形式的函数式接口, 这个接口只有参数没有返回值是个消费型接口
**/
@FunctionalInterface
public interface ThrowExceptionFunction {
/**
* 抛出异常信息
* @param message 异常信息
* @return void
**/
void throwMessage(String message);
}
/**
* 如果参数为true抛出异常
* 创建一个isTure方法,方法的返回值为刚才定义的函数式接口-ThrowExceptionFunction。
* ThrowExceptionFunction的接口实现逻辑为当参数i大于j时抛出异常
* @param i,j
**/
public static ThrowExceptionFunction isTure(int i,int j){
return (errorMessage) -> {
if (i>j){
throw new RuntimeException(errorMessage);
}
};
}
public static void main(String[] args){
//调用方法,传入参数后,调用函数式接口的throwMessage方法传入异常信息
TestController.isTure(10,5).throwMessage("运行时异常");
}
猜你喜欢
- 2025-07-08 对Spring MVC接口进行Mock测试(springmvc对外接口)
- 2025-07-08 还在用策略模式解决 if-else?Map+函数式接口方法才是YYDS
- 2025-07-08 干掉OpenFeign,SpringBoot 3.0 自带的 HTTP 客户端真香!
- 2025-07-08 java开发三年,Java中接口的使用你得知道,不然你凭什么涨薪
- 2025-07-08 Java的类与接口(java接口和接口实现类)
- 2025-07-08 如何理解Java中接口存在的意义(java中接口有什么用)
- 2025-07-08 面试:如何保证接口的幂等性?常见的实现方案有哪些?
- 2025-07-08 java实现接口防刷(java接口防刷策略)
- 2025-07-08 java 9新特性 接口方法私有化(java私有属性怎么调用)
- 2025-07-08 调用AI接口API,需要遵循以下步骤
你 发表评论:
欢迎- 最近发表
-
- 搞趣网:我的世界全新皮肤包原始居民下载地址
- 我的世界拔刀剑MOD下载(我的世界拔刀剑mod下载国际版)
- 我的世界无正版账号的简单联机方法(非网易版,仅适用于局域网)
- 一些可以显著提高大型 Java 项目启动速度的尝试
- 常见的java敏感异常介绍(java 常见的异常)
- Java 开发者必看!三招实现外部 Jar 包动态加载(含热更新方案)
- Java JAR 启动内存参数配置指南:从基础设置到性能优化
- 对Spring MVC接口进行Mock测试(springmvc对外接口)
- 还在用策略模式解决 if-else?Map+函数式接口方法才是YYDS
- 干掉OpenFeign,SpringBoot 3.0 自带的 HTTP 客户端真香!
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)