JAVA之Lambda表达式详解

目录

目录

 一、基本语法:

1、函数式接口

二、Lambda表达式的基本使用

1.无返回值函数式接口

2.有返回值函数接口 

 3.语法精简

三、变量捕获

1.匿名内部类

 2.Lambda的变量捕获

四、Lambda在集合当中的使用

1.List和forEach、sort 

 2.HashMap和forEach

总结


 

 一、基本语法:

    (parameters) -> expression 或 (parameters) ->{ statements; }

1、函数式接口

 函数式接口定义: 一个接口有且只有一个抽象方法

注意:

        1.如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口

        2.如果我们在某个接口上声明了 @FunctionalInterface 注解,那么编译器就会按照函数                    式接口的定义来要求该接口,这样如果有两个抽象方法,程序编译就会报错的。所                          以,从某种意义上来说,只要你保证你的接口中只有一个抽象方法,你可以不加这个                      注解。加上就会自动进行检测的。

 

二、Lambda表达式的基本使用

1.无返回值函数式接口

//无返回值无参数
@FunctionalInterface
interface NoParameterNoReturn {
    void test();
}
//无返回值一个参数
@FunctionalInterface
interface OneParameterNoReturn {
    void test(int a);
}
//无返回值两个参数
@FunctionalInterface
interface MoreParameterNoReturn {
    void test(int a,int b);
}
public class TestDemo {
    public static void main(String[] args) {
        NoParameterNoReturn n = ()->{
            System.out.println("无参数无返回值");
        };
        n.test();

        OneParameterNoReturn o = (a)-> {
            System.out.println("无返回值一个参数"+a);
        };
        o.test(666);
        MoreParameterNoReturn m = (int a,int b)->{
            System.out.println("无返回值两个参数"+a+" "+b);
        };
        m.test(666,999);
    }
}

运行结果:

22c41c48c6f140bcaf20fcb335e63d7e.png

2.有返回值函数接口 

//有返回值无参数
@FunctionalInterface
interface NoParameterReturn {
    int test();
}
//有返回值一个参数
@FunctionalInterface
interface OneParameterReturn {
    int test(int a);
}
//有返回值多个参数
@FunctionalInterface
interface MoreParameterReturn {
    int test(int a,int b);
}
public class TestDemo {
    public static void main(String[] args) {
        NoParameterReturn n = ()->{
            return 666;
        };
        int ret1 = n.test();
        System.out.println(ret1);
        System.out.println("================");
        OneParameterReturn o = (int a)->{
            return a;
        };
        int ret2 = o.test(999);
        System.out.println(ret2);
        System.out.println("================");
        MoreParameterReturn m = (int a,int b)-> {
            return a+b;
        };
        int ret3 = m.test(10,90);
        System.out.println(ret3);
    }
}

运行结果:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YawwrfmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16

 3.语法精简

Lambda表达式的语法还可以精简,显得非常有逼格,但是可读性就非常差。

  1. 参数类型可以省略,如果需要省略,每个参数的类型都要省略。
  2. 参数的小括号里面只有一个参数,那么小括号可以省略
  3. 如果方法体当中只有一句代码,那么大括号可以省略
  4. 如果方法体中只有一条语句,其是return语句,那么大括号可以省略,且去掉return关键字
    把上面的代码精简示例:
	public static void main(String[] args) {
        MoreParameterNoReturn moreParameterNoReturn = (a, b)->{
            System.out.println("无返回值多个参数,省略参数类型:"+a+" "+b);
        };
        moreParameterNoReturn.test(20,30);
        OneParameterNoReturn oneParameterNoReturn = a ->{
            System.out.println("无参数一个返回值,小括号可以省略:"+ a);
        };
        oneParameterNoReturn.test(10);
        NoParameterNoReturn noParameterNoReturn = ()->System.out.println("无参数无返回值,方法体中只有 一行代码");
        noParameterNoReturn.test();
        //方法体中只有一条语句,且是return语句
        NoParameterReturn noParameterReturn = ()-> 40;
        int ret = noParameterReturn.test();
        System.out.println(ret);
    }

三、变量捕获

1.匿名内部类

匿名内部类中:一定是程序在运行的过程当中没有发生改变的变量

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YawwrfmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16

如果把捕获的变量 a在匿名内部类中修改,就会报错。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YawwrfmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16

 2.Lambda的变量捕获

Lambda的变量捕获,同样也是不能捕获放生改变的,如果发生改变就会报错。

@FunctionalInterface
interface NoParameterNoReturn {
	void test();
} 
public static void main(String[] args) {
	int a = 10;
	NoParameterNoReturn noParameterNoReturn = ()->{
	// a = 99; error
	System.out.println("捕获变量:"+a);
	};
	noParameterNoReturn.test();
}

四、Lambda在集合当中的使用

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YawwrfmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16

1.List和forEach、sort 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YawwrfmsrM=,size_20,color_FFFFFF,t_70,g_se,x_16

 

import java.util.*;
import java.util.function.Consumer;

public class TestDemo {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Hello");
        list.add("bit");
        list.add("hello");
        list.add("lambda");
        list.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
        System.out.println("=================");
        list.forEach(a-> System.out.println(a));
    }
}

运行结果:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YawwrfmsrM=,size_14,color_FFFFFF,t_70,g_se,x_16

 2.HashMap和forEach

import java.util.function.Consumer;
public static void main(String[] args) {
        HashMap<Integer, String> map = new HashMap<>();
        map.put(1, "hello");
        map.put(2, "bit");
        map.put(3, "hello");
        map.put(4, "lambda");
        map.forEach(new BiConsumer<Integer, String>(){
            @Override
            public void accept(Integer k, String v){
                System.out.println(k + "=" + v);
            }
        });
    }

运行结果

08647c453ac646c9aa747491b2f5507f.png

 改为Lambda后

public static void main(String[] args) {
        HashMap<Integer, String> map = new HashMap<>();
        map.put(1, "hello");
        map.put(2, "bit");
        map.put(3, "hello");
        map.put(4, "lambda");
        map.forEach((k,v)-> System.out.println("key = "+k+" vak = "+v));
    }

 运行结果

7f8b78165bf04270a628a86149a4ee2f.png

 

总结

Lambda表达式的优点很明显,在代码层次上来说,使代码变得非常的简洁。缺点也很明显,代码不易读
优点:

  1. 代码简洁,开发迅速
  2. 方便函数式编程
  3. 非常容易进行并行计算
  4. Java 引入 Lambda,改善了集合操作
    缺点:
  5. 代码可读性变差
  6. 在非并行计算中,很多计算未必有传统的 for 性能要高
  7. 不容易进行调试

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值