一起学习Lambda表达式(修改)

本章主要讲述的是从JD1.8之后的新特性–lambda表达式的简化和使用方法引用进一步简化lambda表达式。
lambda表达式也可称为闭包,允许把函数作为一个方法的参数(函数作为参数传递进方法中),其核心目的就是为了简化匿名内部类的代码写法,简化函数式接口。
学习使用lambda表达式,看到别人的代码 \ 。。/

一、Lambda表达式格式:
(匿名内部类被重写方法的形参列表) -> {
被重写方法的方法体代码。
}
-> 就是一个新语法,没有实际含义,但是不能省略!

二、 Lambda表达式使用前提
(1)Lambda表达式并不能简化所有匿名内部类的写法。
(2)Lambda表达式只能简化接口中只有一个抽象方法的匿名内部类形式。
(3) Lambda表达式只能简化"函数式接口"的匿名内部类写法:
a.首先必须是接口。
b.接口中只能有一个抽象方法。

那么如何才能确定这个接口可以使用Lambda表达式简化以及如何去将匿名内部类简化?

三、 具体例子
(1)在源码中发现有@FunctionalInterface函数式接口注解,一旦某个接口加上了这个注解,这个接口只能有且仅有一个抽象方法。这个接口就可以被Lambda表达式简化,如下面Runnable接口的匿名内部类的简化过程

//初始形态
new Thread(new Runnable(){
    @Override
            public void run() {
                System.out.println(Thread.currentThread().getName());
            }
        };
}).star();

  ↓↓
  //上下文推断
new Thread(() -> {
                System.out.println(Thread.currentThread().getName());
        }).start();

  ↓↓
//最后的lambda表达式
        new Thread(() -> System.out.println(Thread.currentThread().getName()) ).start();
    }

Lambda简化Comparator接口匿名内部类写法

        Collections.sort(stus, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o2.getColor() - o1.getColor();
            }
        });

        Collections.sort(stus, (Student o1, Student o2) -> {
                return o2.getColor() - o1.getColor();
        });

        Collections.sort(stus, (Student o1, Student o2) -> o2.getColor() - o1.getColor() );

        Collections.sort(stus, ( o1,  o2) -> o2.getColor() - o1.getColor() );

从Runnable和Comparator两个接口的lamda简化写法的过程来看
(1)如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号!
(2)如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写。
此时,如果这行代码是return语句,必须省略return不写,同时也必须省略";"不写
(3)参数类型可以省略不写。
(4)如果只有一个参数,参数类型可以省略,同时()也可以省略。

四、进一步简化Lambda表达式

方法引用:
1.静态方法的引用。
引用格式:
类名::静态方法。
简化步骤:
a.定义一个静态方法,把需要简化的代码放到一个静态方法中去。
静态方法引用的注意事项:被引用的方法的参数列表要和函数式接口中的抽象方法的参数列表一致。
比如上面的Comparator接口lambda表达式最后为

Collections.sort(stus, ( o1,  o2) -> o2.getColor() - o1.getColor() );

通过静态方法引用我们可以写成下面的形式

Collections.sort(lists, Student::compareByAge );

其中Student为类名,compareByAge为静态方法,是写在Student类中

 public static int compareByAge(Student o1 , Student o2){
        return o1.getAge() - o2.getAge();
    }

2.实例方法的引用。
格式: 对象::实例方法。
简化步骤:
a.定义一个实例方法,把需要的代码放到实例方法中去。
比如

      lists.forEach(s ->   System.out.println(s));

可以写成

  lists.forEach(System.out::println);

3.特定类型方法的引用。
特定类型:String ,任何类型。
格式:特定类型::方法。
注意: 如果第一个参数列表中的形参中的第一个参数作为了后面的方法的调用者,并且其余参数作为后面方法的形参,那么就可以用特定类型方法引用了。
比如下面的忽略大小写比较,其中o1,o2是为String类型的参数

  Arrays.sort(strs, ( o1,  o2) -> o1.compareToIgnoreCase(o2) );

就可以简化为

Arrays.sort(strs, String::compareToIgnoreCase);

4.构造器引用。
格式是:类名::new。
注意点:前后参数一致的情况下,又在创建对象就可以使用构造器引用
比如:

   String[] arrs = lists.toArray(new IntFunction<String[]>() {
            @Override
            public String[] apply(int value) {
                return new String[value];
            }
        });

        String[] arrs2 = lists.toArray(value -> new String[value]) ;

通过特定类型方法的引用进一步简化为

String[] arrs2 = lists.toArray(String[]::new) ;
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值