Lambda表达式你学废了吗!

Posted Putarmor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lambda表达式你学废了吗!相关的知识,希望对你有一定的参考价值。

Lambda

1.Lambda语法

Lambda表达式(Lambda expression)是jdk1.8出现的新特性,允许我们通过表达式来代替功能接口;它和正常方法一样,提供了一个正常的参数列表和一个使用这些参数的主体(表达式或者代码块);同时可以看作是一个匿名函数,也可称为闭包(Closure)。

基本语法:(parameters)-> expression 或 (parameters)-> {statements;}

表达式构成:
parameters:就像是方法中的参数列表,这里的参数是函数式接口里的参数,参数类型可以明确地声明也可以不明确地声明去由Jvm隐含判断;当只有一个推断类型时可以省略掉圆括号。
->:理解为“被用于”的意思。
③expression:可以是表达式可以是代码块,是函数式接口里方法的实现;表达式或代码块可以返回一个值也可以什么都不返回,这里的代码块等同方法的方法体。

Lambda示例:
在这里插入图片描述

2.函数式接口

想要对Lambda有清楚的认识,首先就要知道“函数式”接口概念,函数式接口就是指一个接口interface有且只有一个抽象方法

1.当一个接口只有一个抽象方法,该接口就是一个函数式接口
2.在某个接口上使用@FunctionalInterface注解,编译器就会按照函数式接口定义要求该接口,如果有两个抽象方法,程序编译就会报错。

函数式接口定义:

@FunctionalInterface
interface NoParameterNoReturn{
	//只能拥有一个方法
	void testDemo();
}

一、Lambda基本使用

@FunctionalInterface
interface NoParameterNoReturn {
    //注意:只能有一个方法
    void test();
}
//无返回值一个参数
@FunctionalInterface
interface OneParameterNoReturn {
    void test(int a);
}
//无返回值多个参数
@FunctionalInterface
interface MoreParameterNoReturn {
    void test(int a,int b);
}

//有返回值无参数
@FunctionalInterface
interface NoParameterReturn {
    int test();
}

//有返回值一个参数
@FunctionalInterface
interface OneParameterReturn {
    int test(int a);
}
//有返回值多参数
@FunctionalInterface
interface MoreParameterReturn {
    int test(int a,int b);
}


public class TestDemo2 {

    public static void main(String[] args) {
    	//无返回值lambda表达式
        NoParameterNoReturn noParameterNoReturn = ()->{
            System.out.println("woaizhongguo!");
        };
        noParameterNoReturn.test();


        OneParameterNoReturn oneParameterNoReturn = (int a)->{
            System.out.println(a);
        };
        oneParameterNoReturn.test(10);

        MoreParameterNoReturn moreParameterNoReturn = (int a,int b) ->{
            System.out.println(a+b);
        };
        moreParameterNoReturn.test(10,20);

        //一个参数一个返回值的lambda表达式
        OneParameterReturn oneParameterReturn = (int a) -> a;
        System.out.println(oneParameterReturn.test(66));

        OneParameterReturn oneParameterReturn1 = a -> a;
        System.out.println(oneParameterReturn1.test(88));

        OneParameterReturn oneParameterReturn2 = a -> {
            return a;
        };
        System.out.println(oneParameterReturn2.test(99));

    }
}

使用lambda表达式后结果:
在这里插入图片描述

二、变量捕获

Lambda表达式中存在变量捕获,了解变量捕获后才能理解表达式的作用域;我们知道匿名类存在变量捕获,那么接下来我们分别来看匿名内部类的变量捕获与lambda表达式的变量捕获。

变量捕获演示:

class Test{
    public void func() {
        System.out.println("加油!");
    }
}
public class TestDemo3 {

    public static void main(String[] args) {
        int a = 100;
        new Test(){
            @Override
            public void func() {
                //a = 999;  
                System.out.println("奥力给!");
                System.out.println("捕获到的变量:"+a+"这个变量是不能修改过的!");
            }
        }.func();
    }
}

在这里插入图片描述

匿名内部类中,捕获的要么是常量,要么是不能发生修改的变量。

Lambda表达式变量捕获:

public static void main(String[] args) {
        int a = 100;
        NoParameterReturn noParameterReturn = ()->{
            System.out.println(a);
            return 10;
        };
        System.out.println(noParameterReturn.test());
}

在这里插入图片描述

lambda变量捕获要求变量的值也是不能修改的。

三、集合中使用Lambda

为了让Lambda和Java的集合类更好地一起使用,集合当中增加了部分方法,以便于与Lambda表达对接。

对应接口新增的方法
Collectionsteam() forEach() removeIf()等
ListreplaceAll() sort()
MapgetOrDefault() forEach() replace() compute() merge()

List接口演示:

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

在这里插入图片描述
从结果可以看出,我们在List接口中使用了lambda表达式去实现forEach打印了list中的元素。

Collection接口演示:

public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Hello");
        list.add("prepare");
        list.add("for");
        list.add("lambda");
        list.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });
        //list.sort((String o1,String o2)->{return o1.compareTo(o2);});
        list.sort((o1, o2)->  o1.compareTo(o2) );
        list.forEach(s-> System.out.println(s));
    }

在这里插入图片描述
从结果看出,我们使用lambda表达式去实现sort方法,比较了元素之间的大小。

Map接口演示:

public static void main(String[] args) {
        HashMap<Integer, String> map = new HashMap<>();
        map.put(1, "hello");
        map.put(2, "prepare");
        map.put(3, "for");
        map.put(4, "lambda");

        map.forEach(new BiConsumer<Integer, String>() {
            @Override
            public void accept(Integer integer, String s) {
                System.out.println(integer+" "+s);
            }
        });
//        map.forEach((k,v)->{
//            System.out.println(k+" "+v);
//        });
        System.out.println();
        map.forEach((k,v) -> System.out.println(k+" "+v));
    }

在这里插入图片描述

四、Lambda表达式优缺点

从代码层次上看,使代码变得非常简洁,但是代码难读。

优点:

代码简洁,便于开发;
方便函数式编程;
非常容易进行并行计算;
改善了集合操作。

缺点:

代码可读性较差;
不容易进行调试;
在非并行计算中,有些计算不一定有for高效。

以上是关于Lambda表达式你学废了吗!的主要内容,如果未能解决你的问题,请参考以下文章

三分钟撸完前后端crypto-js加解密,你学废了吗?

Linux安装配置MySql-你学废了吗?

微信小程序实时定位的要做的那些事,你学废了吗?

20个高频Spark热门技术点,你学废了吗?

C#数组原来这么简单,你学废了吗?

git--❤️这些最基本和最常用的命令,你学废了吗?(新手必备❤️)