为了账号安全,请及时绑定邮箱和手机立即绑定

【java8】Lambda 表达式学习日记

2017.08.02 17:10 9835浏览

Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。

Lambda 表达式在Java 语言中引入了一个新的语法元 素和操作符。这个操作符为 “->” , 该操作符被称 为 Lambda 操作符或剪头操作符。它将 Lambda 分为 两个部分:

  • 左侧:Lambda 表达式的参数列表
  • 右侧:Lambda 表达式中所需执行的功能, 即 Lambda 体
        //原来使用匿名内部类作为参数传递
        TreeSet<String> ts = new TreeSet<>(new Comparator<String>(){
            @Override
            public int compare(String o1, String o2) {
                return Integer.compare(o1.length(), o2.length());
            }

        });

        //Lambda 表达式作为参数传递
        TreeSet<String> ts2 = new TreeSet<>(
                (x, y) -> Integer.compare(x.length(), y.length())
                );

Lambda 表达式需要“函数式接口”的支持

函数式接口:接口中只有一个抽象方法的接口,称为函数式接口。 可以使用注解 @FunctionalInterface 修饰 (可以检查是否是函数式接口,如果不是函数式接口则会编译不通过)

例如:

@FunctionalInterface
public interface MyFun {

    public Integer getValue(Integer num);

}

Java8 内置的四大核心函数式接口

Java 8 函数式接口 | 菜鸟教程

图片描述

Lambda 表达式的基础语法

语法格式一:无参数,无返回值

() -> System.out.println("Hello Lambda!");

        //原来使用匿名内部类
        Runnable r1 = new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                System.out.println("Hello Word!!");
            }
        };
        r1.run();

        //Lambda 表达式
        Runnable r2 = () -> System.out.println("Hello Lambda!!");
        r2.run();

语法格式二:有一个参数,并且无返回值(只有一个参数可以省去括号)

(x) -> System.out.println(x) 省去括号后 x -> System.out.println(x)

        /**
         * Consumer<T> : 消费型接口
         *  void accept(T t);
         */

        //原来使用匿名内部类
        Consumer<String> con = new Consumer<String>() {

            @Override
            public void accept(String x) {
                // TODO Auto-generated method stub
                System.out.println(x);
            }
        };
        con.accept("Hello Word!!");

        //Lambda 表达式
        Consumer<String> con1 = (x) -> System.out.println(x);
        con1.accept("Hello Lambda!!");

        //Lambda 表达式(一个参数可以无括号)
        Consumer<String> con2 = x -> System.out.println(x);
        con2.accept("Hello Lambda2!!");

语法格式三:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句(需要使用花括号括起来)

         //原来使用匿名内部类
        Comparator<Integer> com = new Comparator<Integer>() {

            @Override
            public int compare(Integer x, Integer y) {

                System.out.println("匿名内部类 输出!!");
                return Integer.compare(x, y);
            }
        };
        System.out.println(com.compare(23, 44));

        //Lambda 表达式
        Comparator<Integer> com1 = (x, y) -> {
            System.out.println("Lambda 输出!!");
            return Integer.compare(x, y);
        };
        System.out.println(com1.compare(23, 44));

语法格式四:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写

Comparator<Integer> com = (x, y) -> Integer.compare(x, y);

         //原来使用匿名内部类
        Comparator<Integer> com = new Comparator<Integer>() {
            @Override
            public int compare(Integer x, Integer y) {
                return Integer.compare(x, y);
            }
        };
        System.out.println(com.compare(23, 44));

        //Lambda 表达式
        Comparator<Integer> com1 = (x, y) -> Integer.compare(x, y);
        System.out.println(com1.compare(23, 44));

语法格式五:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”(参数如果写就都写上去,不能写一部分空一部分)

(Integer x, Integer y) -> Integer.compare(x, y);

         //原来使用匿名内部类
        Comparator<Integer> com = new Comparator<Integer>() {
            @Override
            public int compare(Integer x, Integer y) {
                return Integer.compare(x, y);
            }
        };
        System.out.println(com.compare(23, 44));

        //Lambda 表达式写了数据类型
        Comparator<Integer> com1 = (Integer x, Integer y) -> Integer.compare(x, y);
        System.out.println(com1.compare(23, 44));

        //Lambda 表达式不写数据类型
        Comparator<Integer> com2 = (x, y) -> Integer.compare(x, y);
        System.out.println(com2.compare(23, 44));
总结

Lambda 表达式需要配合“函数式接口”使用,“函数式接口”可以自定义编写,Java8也内置了一部分常用的“函数式接口”。

若只有一个参数左边的括号可以省,若右侧只有一条语句花括号可以省,左侧可以推断出的类型也可以省。


本人小小菜鸟,难免会有错误,希望大神们看到能够及时指出。৳৸ᵃᵑᵏ Ꮍ৹੫ᵎ

参考链接

Java 8 函数式接口 | 菜鸟教程

Java 8 新特性 | 菜鸟教程

点击查看更多内容
14人点赞

若觉得本文不错,就分享一下吧!

评论

相关文章推荐

正在加载中
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消