赞
踩
Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码 像数据一样进行传递(行为参数化)。可以写出更简洁、更 灵活的代码。作为一种更紧凑的代码风格,使 Java的语言表达能力得到了提升.
我们可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它 有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。
在数学中,函数简单可以理解为有输入量、输出量的一套计算方案,也即是"拿数据做操作"
面向对象思想强调的是"必须通过对象的形式来做事情"
函数式编程思想则是尽量去忽略面向对象的复杂语法,而是强调做什么,而不是以什么形式去做
现在我写的Lamdba表达式就是函数式编程思想的体现
创建一个线程的三种形式 ps:使用runnbale接口
3.1、普通方式
步骤为:定义一个类实现runnable接口——>创建该类对象——>入参
- public class MyRunnable implements Runnable {
- @Override
- public void run() {
- System.out.println("myThread");
- }
- }
- public static void main(String[] args) {
- //一、寻常方式
- Runnable runnable=new MyRunnable();
- Thread thread=new Thread(runnable);
- thread.start();
3.2、内部类的方式 Ps:无需具体实现接口的类
- //二、匿名内部类
- new Thread(new Runnable(){
- @Override
- public void run(){
- System.out.println("多线程程序启动了");
- }
- }).start();
3.3、Lambda表达式
- //lambda表达式
- new Thread(()->{
- System.out.println("多线程程序启动了");
- }).start();
(形式参数)——>{代码块}
():里面没有内容,可以看成是方式形式参数为空 Ps:后续会介绍有参数的该如何处理
——>:箭头后面表示要做的事情 Ps:可以看作指向的一个方法的实现
{}:这里包含着一段代码块,可以看成是方法体的具体实现内容
一、有一个接口作为形参
二、接口中有且只有一个抽象方法
三、只要使用Lamdba表达式调用接口入参的方法则方法中的方法体会被执行
第三点可能难理解一些,我们可以写个Demo试试
步骤:定义一个接口,接口实现类,接口入参的方法
分别这么写,
- package com.company;
-
- public interface Eatable {
- void eat();
- }
- package com.company;
-
- public class EatableImpl implements Eatable {
- @Override
- public void eat() {
- System.out.println("为什么我没有被使用");
- }
- }
- package com.company;
-
- public class EatableDemo {
- private static void useEatable(Eatable eatable){
- eatable.eat(); //debug模式下运行第三点就很好理解了
-
- }
- public static void main(String[]args){
- useEatable(()->{
- System.out.println("您吃了没?");
- });
- }
-
一样,用上述Demo,不过匿名内部类的方式不写,我们直接写Lamdba表达式
- public interface Eatable {
- void eat(String a,String b);
- }
- private static void useEatable(Eatable eatable){
- eatable.eat("1","2");
- System.out.println("我被用了");
- }
- public static void main(String[]args){
- //第一种方式
- useEatable((a,b)->{
- /*System.out.println(a+b);
-
- });
//第二种 不省略修饰符
useEatable((String a,String b)->{ /*System.out.println(a+b); });
}
- public interface Eatable {
- void eat(String a);
- }
- private static void useEatable(Eatable eatable){
- eatable.eat("1");
- System.out.println("我被用了");
- }
- public static void main(String[]args){
- //第一种 都省略,包括小括号
- useEatable(a->{
- /*System.out.println(a+b);*/
-
- });
//第二种 都不省略
- useEatable( (String a)->{
- /*System.out.println(a+b);*/
-
- });
//第三种,省略修饰符
- useEatable( (a)->{
- /*System.out.println(a+b);*/
-
- });
}
PS:想怎么写自己的自由,这个不限制
上面的拿过来,加个返回值,只需新增返回值即可
- public interface Eatable {
- String eat(String a);
- }
- private static void useEatable(Eatable eatable){
- eatable.eat("1");
- System.out.println("我被用了");
- }
- public static void main(String[]args){
- useEatable( (a)->{
- return a;
-
- });
8.1 参数类型可以省略
例:useEatable( (a)->{ return a;});
8.2 多个参数的情况下参数类型要么都省略,要么都不省略
8.3 只有一个参数那么小括号也可以省略
useEatable( a->{ return a;});
8.4 如果代码块的语句只有一条可以省略大括号和小括号 PS但是不能有return, 如果想这么写就要把return也省了
useEatable(a->a);
9.1、使用Lamdba必须要有接口,并且要求接口中只有一个抽象方法
9.2、必须要有上下文环境,才能推导出Lamdba对应的接口
无故写一个Lamdba表达式编译器自己根本不晓得去哪里给你找
例: ()->System.out.println(); //绝对会报错,编译不通过
在实际工作中结合Stream流的使用场景会很多,而能够使用Lambda表达式的接口大致可以分为以下四类
1. 消费型接口:Consumer< T> void accept(T t)有参数,无返回值的抽象方法;
2. 供给型接口:Supplier < T> T get() 无参有返回值的抽象方法;
3. 断定型接口: Predicate< T> boolean test(T t):有参,但是返回值类型是固定的boolean
4. 函数型接口: Function< T,R> R apply(T t)有参有返回值的抽象方法;
如果我们调用某一个方法,发现这个方法中需要传入的参数要求是一个函数式的接口,那么我们可以直接传入Lambda表达式。这些接口位于java.util.function包下,需要注意一下,java.util包和java.util.function包这两个包没有什么关系,切不可以为function包是java.util包下面的包。
除了这四个之外,在java.util.function包下还有很多函数式接口可供使用。
当Lambda表达式满足某种条件的时候,使用方法引用,可以再次简化代码(有点语法糖的味道)
方法引用符主要可以分为一下几种场景使用
11.1构造引用,当Lambda表达式是通过new对象的方式来完成的,可以使用构造引用
Supplier<String> stringSupplier=String::new;
11.2 类名::实例方法
- TreeSet<String> set = new TreeSet<>(String::compareTo);
- set.add("Hello");
- set.add("isea_you");
11.3 对象::实例方法
set.forEach(System.out::println);
11.4 类名:;静态方法
- Stream<Double> stream = Stream.generate(Math::random);
-
- stream.forEach(System.out::println);
如果大家想系统的学习java8新特性建议去看看《JAVA8实战》这本书
转载请注明出处,掌声送给社会人
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。