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

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的知识,那些我并未完全读懂,等我研究透了,会在这篇博客中加上。

原文地址:https://www.cnblogs.com/zzuzhouxiang/p/10354922.html

时间: 2024-11-10 18:03:12

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

java 核心技术卷一笔记 6 .1接口 lambda 表达式 内部类

6.1 接口不是类,是对类的一组需求的描述,这些类需要遵守接口描述的统一格式进行定义.例如:Arrays类中sort方法(可以对对象数组进行排序)前提是对象所属的类必须实现了Comparable 接口. public interface Comparable { int compareTo(Object other) } Comparable public interface Comparable<T> { int compareTo(T other) } Comparable泛型 接口的方法

java 核心技术卷一笔记 6 .2接口 lambda 表达式 内部类

6.2 接口实例 6.2.1 接口与回调 在java.swing包中有一个Timer类,可以使用它在到达给定的时间间隔时发出通告,假如程序中有一个时钟,就可以请求每秒钟获得一个通告,以便更新时钟的表盘. 在构造定时器时,需要设置一个时间间隔,并告知定时器,当到达时间间隔时需要做些什么操作,(java将某个类的对象传递给定时器,然后的定时器调用这个对象的方法.)-----定时器需要知道调用了哪一个方法,并要求传递的对象所属的的类实现了java.awt.event包的ActionListener接口

关于JAVA核心技术(卷一)读后的思考(内部类的讨论)

内部类 内部类是定义在另一个类中的类. 定义内部类的原因有: 1)内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据. 2)内部类可以对同一个包中的其他类隐藏起来. 3)当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷. 使用内部类访问对象状态 分析一下下面一段代码 public class TalkingClock { private int interval; private boolean beep; public TalkingClock(int inter

java核心技术卷一

java核心技术卷一 java基础类型 整型 数据类型 字节数 取值范围 int 4 +_2^4*8-1 short 2 +_2^2*8-1 long 8 +_2^8*8-1 byte 1 -128-127       浮点类型 数据类型 字节数 取值范围 小数位数 float 4 10^-38~10^38和-10^-38~-10^38 小数位数6-7 double 4 10^-308~10^308和-10^-308~-10^308 15位小数         boolean 类型和char 类

IDEA中打包Spark项目提示Error:(16, 48) java: -source 1.5 中不支持 lambda 表达式

在idea中新建了一Spark的项目,在做项目的编译打包的时候,提示如下错误信息: Error:(16, 48) java: -source 1.5 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式) 解决方法是: 第一步: File --> Project Stucture 选择项目设置Lanugage level, 如下图所示 第二步: File --> Settings --> Compiler --> Java Compi

读《java核心技术卷一》有感

过去一个多月了吧.才囫囵吞枣地把这书过了一遍.话说这书也够长的,一共706页.我从来不是个喜欢记录的人,一直以来看什么书都是看完了就扔一边去,可能有时候有那么一点想记录下来的冲动,但算算时间太紧,很多也是有始无终,毕竟在之前研究研究程序也只是自己的一个爱好而已,但没有想到签了一个程序员的工作.唉,这老天也太捉弄人了吧,让一个学电气工程(强电方向)学生毕业之后去写代码,而且是与硬件完全无关的代码.真是白念几年大学了.行了,就行发这么多牢骚吧. <java核心技术>有两个卷,我只看了卷一,从我的感

Java核心技术 卷一 笔记六 Date类

在Java核心技术卷就行了一前期  date类出现的频率很高  所以就对date类进行了小小的整合 Date类有两个 date类 表示特定时间的类 这个构造函数分配一个Date对象并初始化它代表指定的毫秒数,因为被称为"纪元",即1970年1月1日00:00:00 GMT标准基准时间. 就像格林尼治时间一样  作为一种基准值而存在 一般常用的是date转为string类型 String s=new Date(0).toString(); System.out.println(s.toS

Java核心技术卷一 4. java接口、lambda、内部类和代理

接口 接口概念 接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义. 如果类遵从某个特定接口,那么久履行这项服务. public interface Comparable<T>{ int compareTo(T other); } 任何实现 Comparable 接口的类都需要包含 compareTo 方法,并且这个方法的参数必须是一个 T 对象,返回一个整形数值. 接口的特点: 接口中所有方法自动地属于 public,所以接口的方法不需要提供关键字 public .

Java 8 vs. Scala(一): Lambda表达式

[编者按]虽然 Java 深得大量开发者喜爱,但是对比其他现代编程语言,其语法确实略显冗长.但是通过 Java8,直接利用 lambda 表达式就能编写出既可读又简洁的代码.作者 Hussachai Puripunpinyo 的软件工程师,作者通过对比 Java 8和 Scala,对性能和表达方面的差异进行了分析,并且深入讨论关于 Stream API 的区别,本文由OneAPM 工程师编译整理. 数年等待,Java 8 终于添加了高阶函数这个特性.本人很喜欢 Java,但不得不承认,相比其他现