java8_01_Lambda

lambda表达式是java8的新特性之一,功能强大,写法简单,实乃java中的“大杀器”。

1.初识Lambda

首先展示一个例子,然后我们用lambda实现同样的功能,方便比较和认知。

//定义一个运算,并输出结果
@FunctionalInterface
public interface ComputeInterface<E> {
    void add(E e1,E e2);
}

public class Compute implements ComputeInterface<Integer> {
    @Override
    public void add(Integer e1, Integer e2) {
        System.out.println(e1 + e2);
    }
}

public class ClientTest {
    //调用上面的计算的方法
    @Test
    public void addTest(){
        ComputeInterface compute = new Compute();
        compute.add(1,2);
    }

    //lambda表达式实现同样的接口
    @Test
    public void lambdaTest(){
        ComputeInterface<Integer> computeInterface = (x,y) -> System.out.println(x+y);
        computeInterface.add(2,7);
    }
}

通过上述简单的例子,我们可以了解到以下几点:
1. lambda表达式可以看做是对接口的特定实现,写法相当于Compute.java的简写。
也有人称Lambda表达式为“语法糖”。
2. 如果对接口add(E e1,E e2) 添加其它实现,如两个String的拼接,以前需要再写一个实现类:

public class ComputeString implements ComputeInterface<String> {
   @Override
    public void add(String e1, String e2) {
        System.out.println("Result:");
        System.out.println(e1 + e2);
    }
}

而使用Lambda可以简单的改写:

    ComputeInterface<String > computeInterface = (x,y) -> System.out.println(x+y);
2. 基本概念
  1. lambda表达式可以说是对接口的方法的实现。但是这个接口很特殊,被称为“函数式接口”。
  2. 函数式接口:只有一个方法声明的接口。可以用@FunctionalInterface标签检测。
    如例子中的ComputeInterface。
3. 基本语法

(左侧参数列表) -> (右侧表达式)
- “->” 称为“lambda表达式符号”
- 常见的几种写法
1. 无参数,无返回值

@Test
public void lambdaTest1(){
    Runnable runnable = () -> System.out.println("hello lambda !");
    runnable.run();
}  

2. 一个参数,有返回值

@Test
public void lambdaTest2(){
    Consumer<Integer> con = (x) -> System.out.println(x * x) ;
    con.accept(10);
}
结果
100

3. 有参数,有返回值

@Test
public void lambdaTest3(){
  IntFunction<Integer> fun = (x) ->{return x * x ; };
  IntFunction<Integer> fun1 = (x) ->  x * x ; // 只有一行代码,可以省略return 和 {}

  int result = fun.apply(10);
  int result1 = fun1.apply(10);

  System.out.println(result);
  System.out.println(result1);
}
3. java8中常用的函数式接口

java8新增了很多函数式接口,我们只需使用lambda表达式实现它即可。详情见java.util.function包。如果没有自己需要的,也可以先定义一个函数式接口,然后再使用。

函数式接口函数描述符原始类型特化
PredicateT->booleanIntPredicate,
LongPredicate,
DoublePredicate
ConsumerT->voidIntConsumer,
LongConsumer,
DoubleConsumer
FunctionT->RIntFunction,
IntToDoubleFunction,
IntToLongFunction,
LongFunction,
LongToDoubleFunction,
LongToIntFunction,
DoubleFunction,
ToIntFunction,
ToDoubleFunction,
ToLongFunction
Supplier()->TBooleanSupplier,
IntSupplier,
LongSupplier,
DoubleSupplier
UnaryOperatorT->TIntUnaryOperator,
LongUnaryOperator,
DoubleUnaryOperator
BinaryOperator(T,T)->TIntBinaryOperator,
LongBinaryOperator,
DoubleBinaryOperator
BiPredicate(L,R)->boolean
BiConsumer(T,U)->voidObjIntConsumer,
ObjLongConsumer,
ObjDoubleConsumer
BiFunction(T,U)->RToIntBiFunction,
ToLongBiFunction,
ToDoubleBiFunction
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值