本文已参与「新人创作礼」活动,一起开启掘金创作之路。
第一章:函数式编程思想
1.1 概述
- 编程中的函数,在你调用我的时候,给我实参为形参赋值,然后通过运行方法体,给你一个返回结果。对于调用者来说,关注的是这个方法具备什么样的功能。相对而言,面向对象过分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语法--
强调做什么,而不是以什么形式做
。
- 面向对象思想:做一件事情,找一个能解决这个事情的对象,调用对象的方法,完成事情。
- 函数式编程思想:只要能获取到结果,谁去做不重要,重视的是结果,不是过程。
- JDK 8 引入了 Lambda 表示式之后,Java 也开始支持函数式编程。
- Lambda 表达式不是 Java 最早使用的,很多语言支持很早就支持 Lambda ,例如:C++ 、C# 、Python 、Scala 等。如果有 JavaScript 或 Python 的语言基础,对理解 Lambda 表达式有很大的帮助,可以说 Lambda 表达式其实就是实现 SAM(Single Abstract Method,即接口中只能有一个抽象方法)接口的语法糖,使得 Java 也算是支持函数式编程的语言。Lambda 写得好可以极大的减少代码冗余,同时可读性也好过冗余的匿名内部类。
注意:
- "语法糖" 是指使用更加方便,但是原理不变的代码语法。例如在遍历集合时使用的 for-each 语法,其实底层的实现原理仍然是迭代器,这便是“语法糖”。
- 从应用层面来讲,Java 中的 Lambda 可以被当做是匿名内部类的“语法糖”,但是二者在原理上是不同的。
1.2 冗余的匿名内部类
●当需要启动一个线程去完成任务的时候,通过会通过 java.lang.Runnable 接口来定义任务内容,并使用 java.lang.Thread 类来启动该线程,代码如下:
package com.example.demo;
public class Test {
public static void main(String[] args) {
// 匿名内部类
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("多线程任务执行!!!!");
}
};
// 启动线程
new Thread(runnable).start();
}
}
- 本着“一切皆对象”的思想,这样的做法无可厚非的:首先创建
Runnable
接口的匿名内部类对象来指定任务内容,然后将其交给一个线程来启动。
- 代码分析:
- 对于Runnable 的匿名内部类的用法,可以分析出以下几点:
- ①
Thread
类需要Runnable
接口作为参数,其中的抽象run
方法是用来指定线程任务内容的核心。
- ② 为了指定
run
的方法体,不得不
需要Runnable
接口的实现类。
-
③ 为了省去定义一个 `Runnable` 实现类的麻烦,`不得不` 实现匿名内部类。
- ④ 为了覆盖重写抽象
run
方法,其方法名称、方法参数、方法的返回值不得不
重写一遍,且不能写错。
- 但是,实际上,
方法体才是关键所在
。