java8常用的函数,以及lamda表达式有非运行异常能否在外部捕获

Stream API中经常使用的函数式接口

函数式接口参数类型返回类型描述
Supplier<T>T提供一个T类型的值
Consumer<T>Tvoid处理一个T类型的值
BiConsumer<T,U>T, Uvoid处理T类型和U类型的值
Predicate<T>Tboolean一个计算Boolean值的函数
ToIntFunction<T>Tint计算int值的函数
ToLongFunction<T>Tlong计算long值的函数
ToDoubleFunction<T>Tdouble计算double的函数
IntFunction<R>intR参数为int类型的函数(特别注意)
LongFunction<R>longR参数为long类型的函数
DoubleFunction<R>doubleR参数类型为double的函数
Function<T,R>TR一个参数类型为T的函数
BiFunction<T,U,R>T,UR一个参数为T和U的函数
UnaryOperator<T>TT对T进行一元操作
BinaryOperator<T>T,TT对T进行二元操作

lamda常用的函数式接口

函数式接口参数类型返回类型抽象方法名描述其他方法
Runnablevoidrun执行一个没有参数和返回值的操作
Supplier<T>Tget提供一个T类型的值
Consumer<T>Tvoidaccept处理一个T类型的值chain
BiConsumer<T,U>T,Uvoidaccept处理T类型和U类型的值chain
Function<T,R>TRapply一个参数类型为T的函数compose,andThen,identity
BiFunction<T,U,R>T,URapply一个参数类型为T和U的函数值andThen
UnaryOperator<T>TTapply对类型T进行的一元操作compose,andThen,identity
BinaryOperator<T>T,TTapply对类型T进行的二元操作andThen
Predicate<T>Tbooleantest一个计算boolean值的函数And,or,negate,isEqual
BiPredicate<T,U>T,Ubooleantest一个含有两个参数,计算boolean的函数and,or,negate
未声明抛出异常的表达式在使用的时候 只能在调用表达式的方法外捕获

假如有个方法的参数是个表达式
我们传入表达式的时候不能在调用这个方法的语句外直接try捕获

public static void testThrowExceptions() throws Exception {
        int[] arr = new int[0];
        arr[0] = 10;
    }

    public static void test(Runnable call) {
        call.run();
    }

不能写为

编译不过
try {
    test(() ->testThrowExceptions());
} catch (Exception e) {
}

而要写为

test(() -> {
    try {
        testThrowExceptions();
    } catch (Exception e) {
        e.printStackTrace();
    }
});

这个问题很小但是一定要搞清楚,我们这个表达式声明没有抛出异常
我们执行表达式的方法也没有处理或者抛出表达式可能发生的异常,因而我们调用test这个方法传入的表达式要自己处理异常。
Q:但是到底可以不可在test外部能不能接住表达式的异常的?
A:其实外部的try是可以捕获表达式内的语句的异常的。如果遇到必须在传入的表达式实现中处理异常,那只是编译的时候语法检查不过,要么是处理表达式的方法test没有抛出异常要么是没有处理异常

  • tips: 如何避免在表达式内写try-catch

①将public static void testThrowExceptions() throws Exception声明
改为

public static void testThrowExceptions() throws RuntimeException 
或
public static void testThrowExceptions()

这样避免在表达式内被强制处理非运行时异常,因为你的表达式内容没有显示的抛出非运行时异常。
②处理表达式的test方法声明抛出或者内部处理异常,或者表达式声明本身抛出异常
我们体验下,这样就能在外部捕获表达式内发生的异常了。

public static void test(Callable<String> call) throws Exception {
    call.call();
}
public static void main(String args[]) {
    try {
        test(() -> {
            testThrowExceptions();
            return "ok";
        });
    } catch (Exception e) {     
        System.out.println("catche"+e);
        e.printStackTrace();
    }   
}
或者
public static void testThrowExceptions() throws Exception {
        int[] arr = new int[0];
        arr[0] = 10;
    }

    public static void test(Callable<String> call) {
        try {
            call.call();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String args[]) {
        test(() -> {
            testThrowExceptions();
            return "ok";
        });
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值