Java学习笔记_Lambda学习

在Java8之前,如果想”让参数具备行为能力”,即将代码块作为参数进行传递,这是很不方便的。比较普遍的方式就是创建一个类的实例对象,让实例去调用这个方法,从而达到代码块的传递。

1.函数式接口

概念:有且仅有一个抽象方法(但可以有其他方法,如:静态方法和默认方法【默认方法主要是为了拓展其实现类时可以不重写接口中的某些方法,提高可拓展性】)的接口,因为只有一个抽象方法才能确保Lambda进行顺利的推导
注解:@FunctionalInterface

// JDK内置的函数式接口 JDK1.8提供的内置函数式接口可以在java.util.function包下获
@FunctionalInterface
public interface Function {
    R apply(T t);
    default  Function compose(Functionsuper V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }
    default  Function andThen(Functionsuper R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }
    static  Function identity() {
        return t -> t;
    }
}

2.Lambda

语法:类型可以省略写(因为有自动推导的功能,这也是为什么函数式接口只允许有一个抽象方法的原因),当执行语句只有一条时吗,可以将{}省略,并且将return关键字省去。除此之外,Lambda有延迟加载的功能,在某些场景下可以提升效率。

无参: ()->{ //执行语句 }
单参:(T t)->{ //执行语句 }
(t)->{ //执行语句 }
多参:(T t, K k)->{ //执行语句 }

Java学习笔记_Lambda学习Java学习笔记_Lambda学习
1 /**
 2  * @Created by zhenjun_gan
 3  * @Date 2020/6/9
 4  * 自定义函数式接口
 5  */
 6 @FunctionalInterface
 7 public interface MyFunction {
 8     void myMethod();
 9 }
10
11 // 测试类
12 public class LambdaExample {
13
14     public static void main(String[] args) {
15         //传统的开启线程
16         new Thread(new Runnable() {
17             @Override
18             public void run() {
19                 System.out.println("开启线程1");
20             }
21         }).start();
22         // Lambda简化
23         new Thread(() -> {
24             System.out.println("开启线程3");
25         }).start();
26
27         new Thread(() -> System.out.println("开启线程2")).start();
28
29         //使用Lambda遍历集合
30         Arrays.asList(1, 2, 2, 4, 1, 66, 3, 778, 0).forEach((num) -> System.out.println(num));
31
32         //测试函数式接口
33         int y = 12;
34         int x = 10;
35         String result1 = adder(x, y, new BiFunction() {
36             @Override
37             public Object apply(Object o, Object o2) {
38                 return "" + x + y;
39             }
40         });
41         //Lambda简化
42         String result3 = adder(x, y, (a, b) -> {
43             return "" + a + b;
44         });
45         //省略 return 和{}
46         String result2 = adder(x, y, (a, b) -> "" + a + b);
47         System.out.println(result1);// 1012
48         System.out.println(result2);// 1012
49         System.out.println(result3);// 1012
50
51         // 延迟执行
52         testFunction(2, () -> System.out.println("执行function.myMethod..."));
53     }
54     //测试自定义的函数式接口
55     public static void testFunction(int a, MyFunction function) {
56         if (a == 1) {
57             System.out.println("执行testFunction...");
58             function.myMethod();
59         }
60     }
61     //做一个字符串的添加
62     public static String adder(Integer x, Integer y, BiFunction fun) {
63         return fun.apply(x, y);
64     }
65 }

Lambda例子代码

3.java8提供的常用函数式接口

Consumer

Java学习笔记_Lambda学习Java学习笔记_Lambda学习
1 class Person {
 2     private String name;
 3     public Person(String name) {
 4         this.name = name;
 5     }
 6     // 重写equals ...

 7     //getter and setter ...

 8 }
 9
10 import java.util.function.Consumer;
11 import java.util.function.Function;
12 import java.util.function.Predicate;
13 import java.util.function.Supplier;
14 /**
15  * @Created by zhenjun_gan
16  * @Date 2020/6/10
17  * 常用的函数式接口
18  */
19 public class CommonFunctionLambdaExample {
20
21     public static void main(String[] args) {
22
23         Person person1 = testSupplier(() -> new Person("张三"));
24         System.out.println(person1);//Person{ name='张三'}
25
26         Person person2 = new Person("李四");
27         testConsumer(person2, person -> System.out.println(person));//Person{ name='李四'}
28
29         String name = "王五";
30         Person person3 = testFunction(name, pName -> new Person(pName));//Person{ name='王五'}
31         System.out.println(person3);
32
33         Person person = new Person("老刘");
34         Person person4 = new Person("老刘");
35         Person person5 = new Person("老王");
36         System.out.println(testPredicate(person4, p -> person.equals(p)));//true
37         System.out.println(testPredicate(person5, p -> person.equals(p)));//false
38     }
39
40     // 生产一个Person对象(生产)
41     public static Person testSupplier(Supplier supplier) {
42         return supplier.get();
43     }
44
45     // 消费一个Person对象(消费)
46     public static void testConsumer(Person person, Consumer consumer) {
47         consumer.accept(person);
48     }
49
50     //消费一个name生产一个Person(转换)
51     public static Person testFunction(String name, Function function) {
52         return function.apply(name);
53     }
54
55     //判断(断言)
56     public static boolean testPredicate(Person person, Predicate predicate) {
57         return predicate.test(person);
58     }
59 }

常用函数式接口

4.结语

java中的函数式接口其实单独使用并没有什么太大的意义,只是相比于传统的代码简化了而已,但是也降低了代码的可读性。Java中使用Lambda主要是为了与Stream结合,在实际工作中也是与Stream结合对数据进行一些操作,与传统的数据集操作相比更具优雅性,同时效率也更高。

Original: https://www.cnblogs.com/zhenjungan/p/13080904.html
Author: zhenjungan
Title: Java学习笔记_Lambda学习

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581884/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • docker安装minio

    拉取镜像 docker pull minio/minio 运行容器 docker run–net=”host”–name minio…

    Linux 2023年6月7日
    078
  • 云笔记本:一个Laxcus应用软件

    给大家展示一个第三方开发的应用软件:云笔记本。 这个作品来自一位Laxcus分布式应用软件开发者,目前已经通过Laxcus集群操作系统的兼容性测试。云笔记本的界面和功能,类似Win…

    Linux 2023年6月6日
    0126
  • Git 代码提交和下载

    1、新建一个目录,存放下载下来的项目; 2、进入刚刚新建的文件夹,点击鼠标右键,选择”Git Bash Here” 3、进行基础配置,作为 Git 的基础配…

    Linux 2023年6月13日
    0116
  • 【MySQL篇】Navicat导入SQL大文件报错终极解决方案

    面对 大数据库文件(一般50M以上),使用Navicat导入的时候容易出现 [ERR]2006等报错问题,此文提供了几种办法,包括修改MySQL的配置参数在网上也有很多详细教程介绍…

    Linux 2023年6月13日
    0102
  • Linux—磁盘管理

    Linux 磁盘管理 磁盘是一种计算机的外部存储器设备,由一个或多个覆盖有磁性材料的铝制或玻璃制的碟片组成,用来存储用户的信息,这种信息可以反复地被读取和改写;绝大多数磁盘被永久封…

    Linux 2023年6月7日
    099
  • 了解GFS

    参考: https://wenku.baidu.com/view/4392293517791711cc7931b765ce0508763275f2.html 论文翻译 https:…

    Linux 2023年6月7日
    0102
  • WEB自动化-12-Cypress 调试

    12 调试 Cypress的测试代码和被测试程序在同一生命周期中的浏览器中,也就是意味着,可以使用浏览器的开发者工具直接参与调试。Cypress提供了几种调试方法,分别为: deb…

    Linux 2023年6月7日
    079
  • 搭建zabbix 4.0

    安装zabbix的依赖包 下载zabbix源码包 数据库导入数据的命令格式:mysql ­u用户名 ­p密码 数据库名称 < 要导入的数据 此时的路径是在databases/…

    Linux 2023年6月8日
    0109
  • Linux 0.11源码阅读笔记-文件管理

    Linux 0.11源码阅读笔记-文件管理 文件系统 生磁盘 未安装文件系统的磁盘称之为生磁盘,生磁盘也可以作为文件读写,linux中一切皆文件。 磁盘分区 生磁盘可以被分区,分区…

    Linux 2023年5月27日
    091
  • Emacs 基础offset值

    cc-mode有如下规定:One of the symbols +, -, ++, –, *, or /These special symbols describe a…

    Linux 2023年6月13日
    084
  • Jenkins,8080端口无法修改问题

    今天安装了 Jenkins 。想把8080 端口修改为 6699 。 出现以下状况。 一:找到 jenkins.xml 文件。 vi /usr/lib/firewalld/serv…

    Linux 2023年6月13日
    082
  • VRRP配置即实验

    VRRP 概念: VRRP 全称是虚拟路由器冗余协议,它是一种容错协议。该协议通过把几台路由设备联合组成一台虚拟的路由设备,该虚拟路由器在本地局域网拥有唯一的一个虚拟ID和虚拟IP…

    Linux 2023年6月6日
    079
  • 很有创意的AkShell:用JS开发web,轻松发布

    今天看了infoq对作者的采访,感觉很有意思。 我去他们的网站看了下,作者是俄罗斯人,他的目标是最大可能地简化web开发。只需要用浏览器就可以开发 ,点两下鼠标就发布了。 他的哲学…

    Linux 2023年5月28日
    095
  • GIT使用说明

    1、Git入门教程 1.1:Git入门与使用 (一) Git介绍与安装 1.2:Git入门与使用 (二) Git相关命令的介绍与使用 1.3:Git入门与使用 (三) 使用GitH…

    Linux 2023年6月13日
    0102
  • 自动化服务器巡检的实现过程

    由于上级的工作安排,从今年5月开始,每天都要做一些服务器信息检查。 [En] Due to the work arrangement of the superior, it is …

    Linux 2023年5月27日
    089
  • 虚拟机Ubuntu22.04 chrome页面显示异常

    虚拟机上ubuntu安装chrome出现页面显示异常的解决办法 将chrome上的硬件加速关掉就能恢复正常 具体原因是啥,有没有大佬能解答以下啊 引用:https://blog.c…

    Linux 2023年6月13日
    083
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球