JDK8 新特性(一)

67 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

第一章:函数式编程思想

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 方法,其方法名称、方法参数、方法的返回值 不得不 重写一遍,且不能写错。
  • 但是,实际上,方法体才是关键所在