关于java核心技术(卷一)读后的思考(lambda表达式的讨论)

zzuzhouxiang      2022-04-27     409

关键词:

lambda表达式

lambda表达式是一个可传递的代码块。可以以后执行一次或者多次。在程序运行中我们经常会遇到传递代码段的情况,但是我们一般都是先构造一个对象,然后通过对象调用相应的代码块来实现传递代码块的目的,这个方法十分繁琐,设计师为解决这个问题,就设计出了lambda表达式。

lambda表达式的语法我们可以参考之前写的方法,可以发现如果方法可以分为方法名,参数和方法主体。lambda表达式就是将方法名省去:

标准情况:

(参数类型1 参数1,参数类型2 参数2,.....,参数类型n 参数n)
—>{方法主体}

lambda表达式就是一个代码块,以及必须传入代码的类型规范。如果表达式只有一句话,可以省去大括号以及return;

(参数类型1 参数1,参数类型2 参数2,.....,参数类型n 参数n)
—>表达式

如果是lambda表达式是无参数的情况时,仍然要提供空括号,就如同无参数方法一样。

()—>{方法主体}

如果可以推导出lambda表达式的参数类型,就可以忽略参数类型。

( 参数1, 参数2,....., 参数n)
—>{方法主体}

如果方法只有一个参数,且这个参数类型是可以推导出来的还可以省略小括号。

参数
—>{方法主体}

在lambda表达式中不需要指定返回类型,其返回类型会在上下文推导出来。

下面的代码实现如何在一个比较器和一个动作监听器中使用lambda表达式。

package com.java.lambda;

import java.util.Arrays;
import java.util.Date;

import javax.swing.JOptionPane;
import javax.swing.Timer;

public class LambdaTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String[] planets=new String[] {"Mercury","Venus","Earth","Mars","Jupiter","Saturn","Uranus","Neptune"};
        System.out.println(Arrays.toString(planets));
        System.out.println("Sorted in dictionary order:");
        Arrays.sort(planets);
        System.out.println(Arrays.toString(planets));
        Arrays.sort(planets, (first,second)->first.length()-second.length());
        System.out.println(Arrays.toString(planets));
        
        Timer t=new Timer(1000,event->System.out.println("The time is "+new Date()));
        t.start();
        JOptionPane.showMessageDialog(null, "Quit Program?");
        System.exit(0);
    }
}

运行结果如下:

[Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune]
Sorted in dictionary order:
[Earth, Jupiter, Mars, Mercury, Neptune, Saturn, Uranus, Venus]
[Mars, Earth, Venus, Saturn, Uranus, Jupiter, Mercury, Neptune]
The time is Thu Feb 07 15:05:03 GMT+08:00 2019
The time is Thu Feb 07 15:05:04 GMT+08:00 2019
The time is Thu Feb 07 15:05:05 GMT+08:00 2019
The time is Thu Feb 07 15:05:06 GMT+08:00 2019
The time is Thu Feb 07 15:05:07 GMT+08:00 2019
The time is Thu Feb 07 15:05:08 GMT+08:00 2019
The time is Thu Feb 07 15:05:09 GMT+08:00 2019

通过分析可以发现,lambda在代码中起到的作用就是直接使用代码块的功能。

 

函数式接口

Java中已经有很多封装代码块的接口,lambda表达式与这些接口是兼容的。对于只有一个抽象方法的接口,需要这种接口的对象时,就可以提供一个lambda表达式。这种接口称为函数式接口。

可以这么理解,如果有一个接口A是只有一个抽象方法的接口,在某个类引用了这个接口,调用这个方法时,那个方法就会执行lambda这个表达式的体。这样会使代码更加简洁。

 

方法引用

方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。计算时,方法引用会创建函数式接口的一个实例。简单地说,就是一个Lambda表达式。在Java 8中,我们会使用Lambda表达式创建匿名方法,但是有时候,我们的Lambda表达式可能仅仅调用一个已存在的方法,而不做任何其它事,对于这种情况,通过一个方法名字来引用这个已存在的方法会更加清晰,Java 8的方法引用允许我们这样做。方法引用是一个更加紧凑,易读的Lambda表达式,注意方法引用是一个Lambda表达式,其中方法引用的操作符是双冒号"::"。

主要分为三种情况:

1)object::instanceMethod

2)  Class::staticMethod

3)  Class::instanceMethod

 

构造器引用

构造器引用与方法引用很类似,只不过方法名为new。例如,Person::new是Person构造器的一个引用,但是我们这个是并不知道哪一个构造器的,这是要根据上下文才能决定的。

可以用数组类型建立构造器引用,例如int[]::new即等价于x->new int[x];

 

 

其实还有一些关于关于lambda的知识,那些我并未完全读懂,等我研究透了,会在这篇博客中加上。

 

关于java核心技术(卷一)读后的思考(equals方法的讨论)

这是我反复看了两遍才理解的部分。其中也不乏参考了他人的微博内容,才大致对这个方法有所理解。首先我们从Object类开始说起,书中已经说了Object类是Java中所有类的始祖,在Java中的每个类都是由他扩展而来的,但在现实使... 查看详情

关于java核心技术(卷一)读后的思考(泛型数组列表的讨论)

在C++中编译时是要确定数组大小的,而Java有所不同,它允许在运行时确定数组的大小。但是如果仅通过数组是无法改变运行时无法动态更改数组的问题。一旦确定了数组大小,就很难改变他了数组的大小了,要解决这个问题,... 查看详情

关于java核心技术(卷一)读后的思考(用户自定义类,静态域和静态方法的思考以及方法参数)

用户自定义类:这部分并没有太过于困难的部分,借由代码进行复习:Employee类的定义:packagecom.java.EmployeeTest;importjava.time.*;publicclassEmployee{   privateStringname;   privatedoublesalary;  &nb 查看详情

关于java核心技术(卷一)读后的思考(接口的基本知识的讨论)

接口接口技术:这种技术主要用来描述类具有什么功能,而并不给出每个功能的具体实现。一个类可以实现一个或多个接口,并在需要接口的地方,随时使用实现了相应接口对象。接口概念:接口不是类,而是对类的一组需求的... 查看详情

关于java核心技术(卷一)读后的思考(对象与类,日历的构造)

关于这本书,前三张都是基本内容,我觉得个人掌握的还可以,所以从第四章开始整理每日所学。第四章主要说的是对象和类。第一部分是面向对象程序设计的概述。其中面向对象程序设计简写OOP,接下来写的是类,即构造对象... 查看详情

关于java核心技术(卷一)读后的思考(lambda表达式的讨论)

lambda表达式lambda表达式是一个可传递的代码块。可以以后执行一次或者多次。在程序运行中我们经常会遇到传递代码段的情况,但是我们一般都是先构造一个对象,然后通过对象调用相应的代码块来实现传递代码块的目的,这个... 查看详情

《java核心技术卷一》随笔

1.静态常量:  静态变量使用得比较少,但静态常量使用得比较多,例如,在Math类中定义了一个静态常量:  publicstaticfinalPI=3.141592653;  在程序中,可以采用Math.PI的形式获得这个常量。  如果关键字static被省略,PI就变... 查看详情

java核心技术卷一笔记7

第九章集合9.1Java集合框架在Java类库中,集合类的基本接口是Collection接口。访问集合元素时,使用“foreach”循环编译器会将其翻译成带有迭代器的循环。元素被访问的数据取决于集合类型,对于ArrayList进行迭代就会按顺序得到... 查看详情

java核心技术卷一笔记8

第十四章并发多进程和多线程的区别:每个进程拥有自己的一套变量,而线程共享数据。14.1什么是线程不要调用Thread类或Runnable对象的run方法。直接调用run方法只会执行同一个线程中的任务,而不会启动新线程。应该调用start方... 查看详情

java核心技术卷一笔记六date类

在Java核心技术卷就行了一前期 date类出现的频率很高 所以就对date类进行了小小的整合Date类有两个date类表示特定时间的类 这个构造函数分配一个Date对象并初始化它代表指定的毫秒数,因为被称为“纪元”,即1970年1... 查看详情

《java核心技术(卷一)》读书笔记——第六章:内部类

1.      内部类的概念?类中类2.      为什么要用内部类?内部类的方法可以访问外部类的实例域内部类对外部类的同一个包中的类实现了隐藏匿名内部类在“想要定义一个回调函数却... 查看详情

go语言核心技术(卷一)之2.1-整数

第二章序 在计算机底层,一切都是比特位。然而计算机一般都操作固定大小的数,称之为字(word)。字会被解释为整数、浮点数、比特位数组、内存地址等,这些字又可以进一步聚合成数据包(packet)、像素点、作品集、是个或者... 查看详情

面霸篇:高频java基础问题(核心卷一)(代码片段)

从面试题作为切入点提升大家的Java内功,所谓根基不牢,地动山摇。只有扎实的基础,才是写出写好代码。拒绝知识碎片化码哥在《Redis系列》的开篇Redis为什么这么快中说过:学习一个技术,通常只接触了零... 查看详情

《大型网站技术架构:核心原理与案例分析》读后感

 李智慧的著作《大型网站技术架构:核心原理与案例分析》,写得非常好, 本着学习的态度,对于书中的关于性能优化的讲解做了一个思维导图,供大家梳理思路和学习之用。抛砖引玉。   查看详情

左耳朵耗子关于技术变现一文读后感

核心论点我完全没有必要通过打工听人安排而活着,而是反过来通过在公司工作提高自己的技能,让自己可以更为独立和只有地生活如何技术变现保持学习,掌握大多数人不能掌握的技能,先让周围的人有求于我关注有价值的东... 查看详情

《构建之法》第十六章读后感更正

第十六章IT行业的创新1.关于灵感。灵光闪现固然重要,很多伟大的发明依靠的就是灵光一现的基础,但是灵光闪现的前提是个人的思考,长时间的思考。完成这一灵光的基础是不断的尝试,提高自己的技术。这样才会将自己的... 查看详情

《java核心技术》读后感(java小虚竹)

❤️作者主页:小虚竹❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者🏆,阿里云专家博主🏆❤️技术活,该赏... 查看详情

读书列表

 记录读书列表,促进阅读~蓝血十杰2017-04-20百年孤独(英文版)ThinkinginC++(英文版)卷一2017-04-26ThinkinginC++(英文版)卷二ReadingCodeJava核心技术卷一Java核心技术卷二重构    查看详情