IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> [JAVA]Lambda表达式 -> 正文阅读

[Java知识库][JAVA]Lambda表达式

Lambda表达式

lambda是一种匿名函数:

正常的函数 :

返回值 方法名 (参数列表){

方法体;

}

lambda表达式

(参数列表)->方法体;

函数式接口

要了解Lambda表达式,首先需要了解什么是函数式接口;函数式接口定义:一个接口有且只有一个抽象方法.

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

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

@FunctionalInterface
interface  NoParameterNoReturn{
    void test();
//    void test1();
//    void test2();//只能有一个方法,当有多个方法就会报错
}

lambda表达式的基本使用

使代码变简洁,但是可读性变差。

无参数无返回值

@FunctionalInterface
interface  NoParameterNoReturn{
    void test();
}

public static void main(String[] args) {
        NoParameterNoReturn noParameterNoReturn = new NoParameterNoReturn() {
            @Override
            public void test() {
                System.out.println("哈哈");
            }
        };
        noParameterNoReturn.test();
        System.out.println("=================================");
    //使用lambda表达式
        NoParameterNoReturn noParameterNoReturn1 = ()->
            System.out.println("haha");
        noParameterNoReturn1.test();
    }

运行结果:

在这里插入图片描述

一个参数无返回值

//无返回值一个参数
@FunctionalInterface
interface OneParameterNoReturn {
    void test(int a);
}
public static void main(String[] args) {
        //OneParameterNoReturn oneParameterNoReturn = (int a) -> System.out.println(a);
        OneParameterNoReturn oneParameterNoReturn = a -> System.out.println(a);
        oneParameterNoReturn.test(10);
    }

运行结果:

在这里插入图片描述

多个参数无返回值

//无返回值多个参数
@FunctionalInterface
interface MoreParameterNoReturn {
    void test(int a,int b);
}
public static void main(String[] args) {
        MoreParameterNoReturn moreParameterNoReturn =
                (int a,int b)-> System.out.println(a+b);
//        MoreParameterNoReturn moreParameterNoReturn =
//                (a,b)-> System.out.println(a+b);//类型可以省略,但是一般不建议省略类型
        moreParameterNoReturn.test(10,20);
    }

运行结果:
在这里插入图片描述

无参数有返回值

//有返回值无参数
@FunctionalInterface
interface NoParameterReturn {
    int test();
}
 public static void main(String[] args) {
//        NoParameterReturn noParameterReturn = ()-> {return 10;};
        NoParameterReturn noParameterReturn = ()->  10;
        System.out.println(noParameterReturn.test());
    }

运行结果:

在这里插入图片描述

一个参数有返回值

//有返回值一个参数
@FunctionalInterface
interface OneParameterReturn {
    int test(int a);
}
public static void main(String[] args) {
//        OneParameterReturn oneParameterReturn = (int a)-> a;
        OneParameterReturn oneParameterReturn =  a-> a;
        System.out.println(oneParameterReturn.test(19));

    }

运行结果:

在这里插入图片描述

多个参数有返回值

@FunctionalInterface
interface MoreParameterReturn {
    int test(int a,int b);
}
public static void main(String[] args) {
//        MoreParameterReturn moreParameterReturn = (int a,int b) -> a + b;
        MoreParameterReturn moreParameterReturn = (a,b) -> a + b;

        System.out.println(moreParameterReturn.test(10, 20));

    }

运行结果:
在这里插入图片描述

变量捕获

匿名内部类的变量捕获

class Test{
    public void func(){
        System.out.println("func()");
    }  
    public static void main(String[] args) {
        int a = 10;

        new Test(){
            @Override
            public void func(){
				//a = 99;若改变a的值就会报错
                System.out.println("这是一个重写的内部类方法");
                System.out.println("我是一个常量或者是一个没有改变过值的变量" + a);//这里a就是一个被捕获的变量
            }
        }.func();

    }
    

上述代码中a就是被捕获的变量,这个变量要么是个常量(被final修饰),要么就是没有被改变的量,若a的值被修稿就会编译报错。

lambda中的变量捕获

在lambda表达式中也可以进行变量捕获,效果与匿名内部类一样。

@FunctionalInterface
interface  NoParameterNoReturn{
    void test();
}

public static void main(String[] args) {
  		int a = 10;
    //使用lambda表达式
        NoParameterNoReturn noParameterNoReturn1 = ()->{
        //a = 99;编译报错
        System.out.println("捕获变量:" + a);
        };
        noParameterNoReturn1.test();
    }

Lambda在集合中的使用

foreach方法

public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Hello");
        list.add("world");
        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(s -> System.out.println(s));
    }

运行结果:

在这里插入图片描述

sort方法

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

运行结果:

在这里插入图片描述

总结

优点:

1.代码简洁;

2.方便函数式编程

3.非常容易进行并行操作(?)

4.改善了集合的操作

缺点;

1.代码可读性变差

2.在非并行计算中,很多计算未必有传统的for性能要高

3.不容易进行调试

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-04 13:15:32  更:2021-12-04 13:16:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:18:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码