lambda表达式

lambda表达式本质上是一个代码块,在Java8以前,不能直接传递一个代码块,必须构造一个对象来编写方法包含这段代码。而在此情况下,lambda横空出世。

基本形式:

参数,箭头(->),表达式

方法引用:

1、对象实例::对象方法

2、Class对象::静态方法

3、Class对象::实例方法

构造器引用

对象::new

注意点:

在lambda表达式中引用的外部变量引用必须是最终变量,即初始化以后就不可以改变,不然是不可以捕获的

lambda表达式的体和嵌套块有同样的作用域,注意命名冲突等等问题比如:

 Integer a=3;
        IntStream.range(0,5).map(f->{
            System.out.println(this.toString());
            return f*3;});

这里的a就冲突了,而this指代的也是本对象,和普通的this使用没有差别

使用lambda的重点是延迟执行,像方法一样被调用,或者是单独线程的中运行的代码等等

如果你写的方法要接受lambda表达式,需要一个函数式接口 ,以下表格均引至Java核心技术卷 卷一

常用函数式接口
函数式接口参数类型返回类型抽象方法名描述其他方法
Runnablevoidrun作为无参数或返回值的动作执行 
Supplier<T>Tget提供一个T类型的值 
Consumer<T>Tvoidaccept处理一个T类型的值andThen
BiConsumer<T,U>T,Uvoidaccept处理T和U类型的参数andThen
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

maxBy

minBy

Predicate<T>Tbooleantest布尔值函数

and,or

negate

isEqual

BiPredicate<T,U>T,Ubooleantest有两个参数的布尔值函数

and,or

negate

 

基本类型的函数式接口
函数式接口参数类型返回类型抽象方法名
BooleanSuppliernonebooleangetAsBoolean
PSuppliernonepgetAsP
PConsumerpvoidaccept
ObjPConsumer<T>T,pvoidaccept
PFunction<T>pTapply
PToQFunctionpqapplyAsQ
ToPFunction<T>TpapplyAsP
ToPBiFunction<T,U>T,UpapplyAsP
PUnaryOperatorppapplyAsP
PBinaryOperatorp,ppapplyAsP
PPredicatepbooleantest

P、Q为Integer,Long,Double p、q为int,long,double

@FunctionalInterface注解标记的接口可以提醒编译器检查该接口是否仅仅包含一个抽象方法

下面看两个小例子:

 public static void print(List<Integer> n, Consumer<Integer> consumer){
       for(Integer g:n){
           consumer.accept(g);
       }
    }

    public static Double change(int g,IntToDoubleFunction toDoubleFunction){
        return toDoubleFunction.applyAsDouble(g);
    }

    public static void main(String[] args) throws Exception{
       int g=2;
        System.out.println(change(g,i->Math.pow(i,i)));
        print(IntStream.range(0,10).mapToObj(Integer::new).collect(Collectors.toList()),e-> System.out.println(e));
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值