• Java8 Lambda表达式


    概述

    lambda表达式, 是Java8中的一个新特性。可以理解为一个匿名函数。

    lambda表达式可以理解为将一个函数浓缩为一行代码,使代码更加简洁紧凑。

    lambda表达式语法:

    (parameters) -> statement;
    // 或
    (parameters) -> {statements;}
    

    参数如下:

    • parameters:参数, 可以指定或不指定参数类型, 当只有一个参数时可以不要圆括号
    • statement:函数返回值,直接返回该值,无需大括号
    • statements:函数体,当使用大括号时需要指明表达式返回的值

    lambda表达式实例:

    // 无参,返回5
    () -> 5;
    // 接收参数x,返回2*x
    x -> 2 * x;
    // 接收参数x y, 返回x+y
    (x, y) -> x + y;
    // 指明接收参数类型
    (int x, int y) -> x + y;
    // 接收字符串并打印,无返回值
    (String s) -> System.out.print(s);
    // 包括函数体
    (String s) -> {
     System.out.print(s);
     return s; 
     };
    

    Java中使用lambda表达式

    在Python中是有的。但是Python中万物皆对象,直接将函数赋值给一个变量即可,那么在Java中该如何使用lambda表达式呢?

    1539320106264ef127a2705 (624×344)

    15393201849958a86be6d0d (316×111)

    运行结果

    可以看出lambda表达式实质是实现了接口中的方法,怎么感觉向匿名内部类呢?

    lambda表达式与匿名内部类的区别:

    1. this关键字。匿名内部类中的this指当前匿名类,lambda表达式中的this指lambda的外部类。

    FunctionInterface注解:

    @ FunctionInterface 是Java8中新加入的接口, 用于指明该接口是根据Java语言规范定义的函数式接口。例如如下代码:

    @FunctionInterface
    public interface MathOperation{
     public int operation(int a, int b);
    }
    

    若在接口中加入更多的抽象方法, 将抛出编译错误。

    lambda表达式中的变量

    1539321716982a8616456a1 (640×454)

    这样看没什么毛病,但是要想在后面修改该字符串,问题就来了

    15393217916843bd84bf174 (846×231)

    可以看到,lambda表达式使用的外部的局部变量必须是final的,那么成员变量呢?

    153932236639855d673bb3e (622×500)

    成员变量以及静态变量可以使用,并在之后进行修改,至于原因可以看我的这篇文章

    Java 内部类

    Java中lambda表达式举例

    那么Java中引入lambda表达式可以带来怎样的便利呢?通过下面几个例子可以看一看:

    1.创建线程

    1539323164674366037e1d2 (613×385)

    2.遍历list

    Java8 Lambda表达式

    当然还有很多,可以自己尝试

    Java8 函数式接口

    函数式接口就是一个有且仅有一个抽象方法, 但可以有多个非抽象方法的接口.

    函数式接口很好的支持了lambda表达式。

    JDK1.8之前以有的函数式接口:

    • java.lang.Runable
    • java.util.concurrent.Callable
    • java.security.PrivilegedAction
    • java.util.Comparator
    • java.io.FileFilter
    • java.nio.file.PathMatcher
    • java.lang.reflect.InvocationHandler
    • java.beans.PropertyChangeListener
    • java.awt.event.ActionListener
    • javax.swing.event.ChangeListener

    JDK1.8新增的函数式接口:

    java.util.function 包下包含了很多类,用来支持Java的函数式编程,该包下的函数式接口有:

    1. BiConsumer<T,U>: 代表了一个接受两个输入参数的操作,并且不返回任何结果
    2. BiFunction<T,U,R>: 代表了一个接受两个输入参数的方法,并且返回一个结果
    3. BinaryOperator: 代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果
    4. BiPredicate<T,U>: 代表了一个两个参数的boolean值方法
    5. BooleanSupplier: 代表了boolean值结果的提供方
    6. Consumer: 代表了接受一个输入参数并且无返回的操作
    7. DoubleBinaryOperator: 代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。
    8. DoubleConsumer: 代表一个接受double值参数的操作,并且不返回结果。
    9. DoubleFunction: 代表接受一个double值参数的方法,并且返回结果
    10. DoublePredicate: 代表一个拥有double值参数的boolean值方法
    11. DoubleSupplier: 代表一个double值结构的提供方
    12. DoubleToIntFunction: 接受一个double类型输入,返回一个int类型结果。
    13. DoubleToLongFunction: 接受一个double类型输入,返回一个long类型结果
    14. DoubleUnaryOperator: 接受一个参数同为类型double,返回值类型也为double 。
    15. Function<T,R>: 接受一个输入参数,返回一个结果。
    16. IntBinaryOperator: 接受两个参数同为类型int,返回值类型也为int 。
    17. IntConsumer: 接受一个int类型的输入参数,无返回值 。
    18. IntFunction: 接受一个int类型输入参数,返回一个结果 。
    19. IntPredicate: 接受一个int输入参数,返回一个布尔值的结果。
    20. IntSupplier: 无参数,返回一个int类型结果。
    21. IntToDoubleFunction: 接受一个int类型输入,返回一个double类型结果 。
    22. IntToLongFunction: 接受一个int类型输入,返回一个long类型结果。
    23. IntUnaryOperator: 接受一个参数同为类型int,返回值类型也为int 。
    24. LongBinaryOperator: 接受两个参数同为类型long,返回值类型也为long。
    25. LongConsumer: 接受一个long类型的输入参数,无返回值。
    26. LongFunction: 接受一个long类型输入参数,返回一个结果。
    27. LongPredicate: R接受一个long输入参数,返回一个布尔值类型结果。
    28. LongSupplier: 无参数,返回一个结果long类型的值。
    29. LongToDoubleFunction: 接受一个long类型输入,返回一个double类型结果。
    30. LongToIntFunction: 接受一个long类型输入,返回一个int类型结果。
    31. LongUnaryOperator: 接受一个参数同为类型long,返回值类型也为long。
    32. ObjDoubleConsumer: 接受一个object类型和一个double类型的输入参数,无返回值。
    33. ObjIntConsumer: 接受一个object类型和一个int类型的输入参数,无返回值。
    34. ObjLongConsumer: 接受一个object类型和一个long类型的输入参数,无返回值。
    35. Predicate: 接受一个输入参数,返回一个布尔值结果。
    36. Supplier: 无参数,返回一个结果。
    37. ToDoubleBiFunction<T,U>: 接受两个输入参数,返回一个double类型结果
    38. ToDoubleFunction: 接受一个输入参数,返回一个double类型结果
    39. ToIntBiFunction<T,U>: 接受两个输入参数,返回一个int类型结果。
    40. ToIntFunction: 接受一个输入参数,返回一个int类型结果。
    41. ToLongBiFunction<T,U>: 接受两个输入参数,返回一个long类型结果。
    42. ToLongFunction: 接受一个输入参数,返回一个long类型结果。
    43. UnaryOperator: 接受一个参数为类型T,返回值类型也为T。
  • 相关阅读:
    JS弹出一个等待对话框,js iframe等待 推荐一下
    netsuite 支持的字段计算函数 oracle 函数
    js 动态创建iframe 后submit提交
    netsuite凭证批量打印中涉及的html分页打印问题,页面的部分打印
    1099MISC是什么
    debit,credit,日记帐就是每天都要登的帐
    netsuite SyncQtyRate
    netsuite与首信易支付(v4.3)接口
    呼叫中心(Call Center)介绍及产品功能列表
    Js MD5加密问题
  • 原文地址:https://www.cnblogs.com/hujingnb/p/10181624.html
Copyright © 2020-2023  润新知