函數式編程很難懂?其實真心很簡單

2020-12-15 劉小愛

今天是我自學Java的第35天。

感謝你的觀看,謝謝你。

話不多說,開始今天的學習:

現在直播一直都很火,今天我們就用Java代碼簡單地模擬一個直播案例,以此來一步步說明什麼叫函數式編程。

不要看這個名字好像挺難懂的樣子,其實很簡單,兩分鐘時間即可看完。

一、直播間案例

現在有一個直播平臺,它如何管理那些想直播的人?很簡單,制定規則就好了,在Java裡面接口的作用就是制定規則。

①有一個接口叫LiveRoom,就是直播間。

你想要直播?很簡單,實現直播間接口就好了,實現了你就能開個直播間直播了。

②LiveRoom接口裡有一個抽象方法叫live()

表示的就是直播間直播的什麼內容?

你播遊戲也行,播唱歌也行,播吃飯,播睡覺都可以,所以我用一個抽象方法表示直播的內容,你具體播什麼我不清楚,都可以。

你實現我這個接口了,必須要重寫live方法。

簡單地理解就是,你必須得告訴我你直播什麼,我才能讓你直播,不然你不能有直播間。

規則制定完畢,好,現在有一個直播間,在玩遊戲,一看直播間名字,哦,叫劉小愛。

這個用Java代碼如何表現出來?

1.最常規代碼

①創建一個劉小愛類

實現LiveRoom接口,劉小愛既然能直播,肯定是實現了直播接口的。

②重寫接口裡的live方法

劉小愛直播的是啥?哦,原來是魔獸rpg遊戲。

③創建劉小愛對象

將劉小愛對象作為參數傳入method方法。

④method方法

直播間會調用live方法,輸出正在直播什麼內容。

所以運行代碼,控制臺就會輸出:「玩魔獸rpg遊戲」。

現在問題來了,代碼能不能簡化?

可以的,使用匿名內部類就好了。

2.匿名內部類

我既然是看直播,直播間名字叫啥重要麼?

直播間叫劉小愛也好,叫劉大愛也罷,哪怕是叫劉老愛都無關緊要,我是要看直播的內容,那我完全可以不用創建劉小愛類。

代碼如下:

⑤匿名內部類

既然名字不重要,直播間沒有名字了,那就直接用父接口LiveRoom的名字代替就好了。

new LiveRoom(){},這表示的就是LiveRoom的子類(實現類)對象,也就相當於是常規方法中的劉小愛對象。

匿名內部類省略了類名,不用創建一個實現類,所以更簡單。

那還能不能再簡化?

可以的,也就是今天的重點,函數式編程。

二、函數式編程

函數,這個概念我們在數學裡面我們就接觸過。

y=f(x)(y=x+1)這就是函數的格式,其中f是函數名,x是變量,y是函數值,還有定義域,值域什麼的。

你發現沒有,Java中的方法其實就是一個函數:

方法名不就是函數名麼?參數也就是函數中的變量,返回值也就是函數值?它們本質上是一樣的的,只不過叫法不一樣,並且在有的程式語言中方法也就叫函數。

前面無論是最常規代碼還是匿名內部類,它們都有一個重點:LiveRoom接口中的live方法,也就是重寫後的方法。

函數式編程就是依據這個方法來的:

⑥Lambda表達式

lambda,中文翻譯過來就是拉姆達,還記得數學中:λ這個字符麼?說的就是它。

lambda表達式表示的是什麼?本質上就是LiveRoom接口中的live方法。

沒有參數,就用一個()表示;有參數的話,就將參數寫在()裡面;輸出的內容為重寫後的方法體;如果有返回值,就用return返回;如果沒有返回值,return可以省略。什麼叫函數式編程?

就可以理解成用什麼參數執行了一件什麼事情,這就是函數式編程,它是匿名內部類進一步的簡化,可以讓代碼更加的簡潔。

但它有一個使用的前提,接口得是函數式接口。

什麼叫函數式接口?

有且僅有一個抽象方法需要被重寫的接口。

這個怎麼理解?很簡單,函數式編程和匿名內部類相比,它省略了啥?

它省略了接口中的方法名,為什麼可以省略?

因為就只有一個方法,那就算省略了方法名字,也知道是用的那個方法。

這就好比你是家裡的獨生子,那你爸媽回來叫你寶貝,叫你甜心,叫你小兔崽子,別人都知道你爸媽是在叫你。

但如果你還有個弟弟,你爸媽再這麼叫你,別人就搞不清楚你爸媽到底是在叫你,還是在叫你弟弟了。

關於函數式編程暫時就先介紹到著,以後有經典的筆試題會用代碼再次演示,畢竟實戰才是王道 。

總結:

相關焦點

  • 知識分享之函數式編程的簡單介紹
    各位小夥伴們大家好,好久不見,這次小編要分享的一個知識是有關於函數式編程的。函數式編程是近年來比較熱門的一個話題,很多人都在談FunctionalProgramming,函數式編程有如下特點:函數即為數據,第一等公民。
  • 函數式編程那些事兒
    函數式編程是一種編程範式,在其中它試圖將每個函數都綁定到純數學函數中。這是一種聲明式的編程風格,著重於解決什麼而不是如何解決。Clojure,Common Lisp,Erlang,Haskell和Scala是遵循函數式編程方法的一些著名程式語言。
  • java8的函數式編程解析
    其實在java8就已經有java的函數式編程寫法,只是難度較大,大家都習慣了對象式用法,但在其它語言中都有函數式的用法,如js,scala,函數式其實是抽象到極致的思想。什麼是函數式編程 函數式編程並不是Java新提出的概念,其與指令編程相比,強調函數的計算比指令的計算更重要;與過程化編程相比,其中函數的計算可以隨時調用。
  • 輕鬆玩轉函數式編程
    於是我抽時間捋了捋,將平時工作中用到的函數式編程案例和思想整理了出來,相信閱讀本文後,大家都能快速上手函數式編程。 函數式編程目前使用範圍非常廣,常用的框架,語言幾乎都能看到它的身影。 前端框架:react、vue 的 hooks 用法。
  • 大數據入門:Scala函數式編程
    命令式編程VS函數式編程命令式編程,程序邏輯的基本元素是:變量+操作符+控制結構,這些元素構成一條條的代碼指令,因此,稱之為命令式編程。函數式編程,程序邏輯由:map+匿名函數組成。整個代碼中,看不到變量、控制結構、操作符等元素,看到的只有函數,因此,函數式編程的本質就是:程序邏輯的基本元素是函數。
  • 從Python到Haskell:程式設計師為何與函數式編程「墜入愛河」?
    儘管像Google這樣的大公司依賴於函數式編程的關鍵概念,但是普通程式設計師對此幾乎一無所知。這種情況即將改變了。不僅是Java或Python這樣的語言越來越多地採用了函數式編程的概念,類似Haskell這樣的新語言也正在完全實現函數式編程。簡單來說,函數式編程就是為不可變變量構建函數。
  • 寫Python 代碼不可不知的函數式編程技術
    選自 Medium作者:Raivat Shah參與:魔王、Jamin本文對 Python 中的函數式編程技術進行了簡單的入門介紹。近來,越來越多人使用函數式編程(functional programming)。因此,很多傳統的命令式語言(如 Java 和 Python)開始支持函數式編程技術。本文對 Python 中的函數式編程技術進行了簡單的入門介紹。本文適合對函數式編程有基本了解的讀者。
  • 純Java中的函數式編程:Functor和Monad示例
    絕大多數程式設計師,特別是那些沒有功能編程背景的程式設計師,都傾向於認為monad是某種神秘的計算機科學概念,因此從理論上講,它對他們的編程事業沒有幫助。這種消極的觀點可以歸因於數十篇文章或博客文章過於抽象或過於狹窄。但是事實證明,即使在標準Java庫中,monad也無處不在,尤其是從Java Development Kit(JDK)8開始(以後會有更多介紹)。
  • Python並發編程很簡單,一文搞清如何使用構造器創建線程
    好問題哦,其實呢,_thread是提供低級別而且是比較原始的線程支持的哦,而且呢它還有一個簡單的鎖,通過以前咱們的講解大家對於_thread前面的下劃線的意思已經明白啦,它是代表隱藏的含義哦,這也表明了其實Python是不建議咱們使用這個_thread的;因此呢,如果你在Python中想進行多線程編程,那就好好使用threading模塊吧,因為在threading中提供了功能超級豐富的對多線程編程的支持哦
  • 讓你徹底明白yield語法糖的用法和原理及在C 函數式編程中的作用
    骨架代碼猜想骨架代碼其實很簡單,方法的返回值是IEnumerable,然後return被yield開了光,讓人困惑的地方就是既然方法的返回值是IEnumerable卻在方法體內沒有看到任何實現這個接口的子類,所以第一感覺就是這個yield不簡單,既然代碼可以跑,那底層肯定幫你實現了一個繼承IEnumerable接口的子類,你說對吧?
  • Spark程式語言之scala
    scala具有自己特有的語法:增強,函數式編程,偏函數,函數的柯裡化高階函數,將函數作為參數傳遞等。2.Spark架構由scala語言編寫。3.Scala語言的特點:Scala是以一門以java虛擬機JVM為運行環境的將面向對象,函數式編程結合在一起的靜態類型程式語言。Scala原始碼.scala會被編譯成Java字節碼.class,然後運行於JVM上。
  • 基於Python腳本的R語言的函數
    如何在Python環境中模仿函數式編程? R語言的函數編程特性為用戶提供了非常簡單有效地界面,用於快速計算概率,並為數據分析問題提供必要的描述性/推理統計。例如,僅僅使用一個緊緻函數調用就能回答下面的問題,這是不是很神奇? 如何計算數據向量的平均/中值/模型?
  • 大數據入門:Java和Scala編程對比
    在學習大數據之初,很多人都會對程式語言的學習有疑問,比如說大數據編程主要用什麼語言,在實際運用當中,大數據主流編程是Java,但是涉及到Spark、Kafka框架,還需要懂Scala。今天的大數據入門分享,我們就來對Java和Scala這兩門語言的編程做個對比。
  • 利用EasyX圖像編程製作y=x^2函數圖像
    ;cmath>#include<conio.h>int main(){int x=-50;initgraph(100,200);SetWindowText(GetHWnd(),"二次函數圖像
  • Scratch編程28:創建帶參數的函數之自製積木選項
    #少兒編程#上一篇我們說了如何創建自製積木,不過那篇創建的積木比較簡單,它很多條件都是定死的,所以使用起來不靈活。>任務內容:製作帶參數的「跳舞」積木,需要滿足如下要求:跳舞的時間和風格通過參數傳遞給積木通過切換造型實現跳舞使用計時器來控制跳舞的時間2、編程實現
  • 面向對象編程會被拋棄嗎?這五大問題不容忽視
    上圖文章連結:https://towardsdatascience.com/why-developers-are-falling-in-love-with-functional-programming-13514df4048e函數和數據耦合面向對象編程的主要思想非常簡單:嘗試將一個功能強大的程序整體分解為功能同樣強大的多個部分
  • SUMIF函數的高級用法,簡單實用,一學就會
    要說,如果你會使用 SUMIF 函數的話,這個問題也不難。方法 1首先,我們添加一個輔助列,把每個服裝的分類整理出來。然後用 SUMIF 函數求和即可。完整的公式如下:=SUMIF($A$2:$A$100 ,E2 ,$C$2:$C$100)SUMIF 函數的用法很簡單,按照指定條件求和。
  • 北大青鳥:2020年5月中國程式語言排行榜,哪種編程工資最高呢?
    :0.71% 簡介:Scala是一門多範式的程式語言,一種類似java的程式語言 ,設計初衷是實現可伸縮的語言 、併集成面向對象編程和函數式編程的各種特性。:0.10% 簡介:Rust是一門系統程式語言 ,專注於安全 ,尤其是並發安全,支持函數式和命令式以及泛型等編程範式的多範式語言。
  • 都說編程難,編程到底難在哪裡?
    編程的定義簡單來說就是編定程序,程序是什麼,就是人類為了解決某個問題,針對計算機設定一定的運算方式方法,讓計算機按照我們的程序指令一步步地去工作,達到某種結果。但是術業有專攻,程式設計師也會覺得其他行業難,所以判斷一個行業專業難不難,不能簡單看字面,要深入了解接觸一下。首先,編程是一門技術,技術就是需要多操作練習的。但是學編程也有要求,一是你感不感興趣,二是你的邏輯思維如何,面對邏輯思維這個要求,一般也會覺得難,因為它比較抽象,而且要求思維嚴密,各方面都要考慮到,嚴謹性要求高。
  • Scratch編程27:如何創建函數之自製積木
    當然對於簡單的積木,這些選項是不需要的,只有創建更高級的積木時,才會用到這三個選項。圖4【練習】我們先來創建一個簡單的積木,看看自製積木的創建過程以及如何使用。>)點擊角色設置區的Ballerina角色,將該角色設為當前編程對象。