日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Scala与Java差异(三)之函数

發(fā)布時(shí)間:2023/12/3 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Scala与Java差异(三)之函数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、函數(shù)定義

(1)函數(shù)的定義與調(diào)用

在Scala中定義函數(shù)時(shí),需要定義函數(shù)的函數(shù)名、參數(shù)、函數(shù)體。

第一個(gè)函數(shù)如下所示:

def sayHello(name: String, age: Int) = {if (age > 18) { printf("hi %s, you are a big boy\n", name); age }else { printf("hi %s, you are a little boy\n", name); age}sayHello("leo", 30)

Scala要求必須給出所有參數(shù)的類型,但是不一定給出函數(shù)返回值的類型,只要右側(cè)的函數(shù)體中不包含遞歸的語(yǔ)句,Scala就可以自己根據(jù)右側(cè)的表達(dá)式推斷出返回類型。

?(2)在代碼塊中定義包含多行語(yǔ)句的函數(shù)體

單行的函數(shù):def sayHello(name: String) = print("Hello, " + name)

如果函數(shù)體中有多行代碼,則可以使用代碼塊的方式包裹多行代碼,代碼塊中最后一行的返回值就是整個(gè)函數(shù)的返回值。與Java中不同,不是使用return返回值的。

比如如下的函數(shù),實(shí)現(xiàn)累加的功能:

def sum(n: Int) = {var sum = 0;for(i <- 1 to n) sum += isum }

(3)遞歸函數(shù)與返回類型

如果在函數(shù)體內(nèi)遞歸調(diào)用函數(shù)自身,則必須手動(dòng)給出函數(shù)的返回類型。

例如,實(shí)現(xiàn)經(jīng)典的斐波那契數(shù)列:

9 + 8; 8 + 7 + 7 + 6; 7 + 6 + 6 + 5 + 6 + 5 + 5 + 4; ....

def fab(n: Int): Int = {if(n <= 1) 1else fab(n - 1) + fab(n - 2)}

?

二、函數(shù)的默認(rèn)參數(shù)和帶名參數(shù)

(1)?默認(rèn)參數(shù)

在Scala中,有時(shí)我們調(diào)用某些函數(shù)時(shí),不希望給出參數(shù)的具體值,而希望使用參數(shù)自身默認(rèn)的值,此時(shí)就定義在定義函數(shù)時(shí)使用默認(rèn)參數(shù)。

def sayHello(firstName: String, middleName: String = "William", lastName: String = "Croft") = firstName + " " + middleName + " " + lastName

如果給出的參數(shù)不夠,則會(huì)從作往右依次應(yīng)用參數(shù)。

(2)Java與Scala實(shí)現(xiàn)默認(rèn)參數(shù)的區(qū)別

Java:

public void sayHello(String name, int age) {if(name == null) {name = "defaultName"}if(age == 0) {age = 18}}sayHello(null, 0)

Scala:

def sayHello(name: String, age: Int = 20) {print("Hello, " + name + ", your age is " + age)}sayHello("leo")

(3)帶名參數(shù)

在調(diào)用函數(shù)時(shí),也可以不按照函數(shù)定義的參數(shù)順序來(lái)傳遞參數(shù),而是使用帶名參數(shù)的方式來(lái)傳遞。

sayHello(firstName = "Mick", lastName = "Nina", middleName = "Jack")

還可以混合使用未命名參數(shù)和帶名參數(shù),但是未命名參數(shù)必須排在帶名參數(shù)前面。

sayHello("Mick", lastName = "Nina", middleName = "Jack")

?

三、函數(shù)的變長(zhǎng)參數(shù)

(1)變長(zhǎng)參數(shù)

在Scala中,有時(shí)我們需要將函數(shù)定義為參數(shù)個(gè)數(shù)可變的形式,則此時(shí)可以使用變長(zhǎng)參數(shù)定義函數(shù)。

def sum(nums: Int*) = {var res = 0for (num <- nums) res += numres}sum(1, 2, 3, 4, 5)

(2)使用序列調(diào)用變長(zhǎng)參數(shù)

在如果想要將一個(gè)已有的序列直接調(diào)用變長(zhǎng)參數(shù)函數(shù),是不對(duì)的。比如val s = sum(1 to 5)。此時(shí)需要使用Scala特殊的語(yǔ)法將參數(shù)定義為序列,讓Scala解釋器能夠識(shí)別。這種語(yǔ)法非常有用!一定要好好注意,在spark的源碼中大量地使用到了。

val s = sum(1 to 5: _*)

案例:使用遞歸函數(shù)實(shí)現(xiàn)累加

def sum2(nums: Int*): Int = {if (nums.length == 0) 0else nums.head + sum2(nums.tail: _*)

?

四、函數(shù)的過(guò)程、lazy值和異常

(1)過(guò)程

在Scala中,定義函數(shù)時(shí),如果函數(shù)體直接包裹在了花括號(hào)里面,而沒有使用=連接,則函數(shù)的返回值類型就是Unit。這樣的函數(shù)就被稱之為過(guò)程。過(guò)程通常用于不需要返回值的函數(shù)。

過(guò)程還有一種寫法,就是將函數(shù)的返回值類型定義為Unit。

def sayHello(name: String) = "Hello, " + namedef sayHello(name: String) { print("Hello, " + name); "Hello, " + name }def sayHello(name: String): Unit = "Hello, " + name

(2)lazy值

在Scala中,提供了lazy值的特性,也就是說(shuō),如果將一個(gè)變量聲明為lazy,則只有在第一次使用該變量時(shí),變量對(duì)應(yīng)的表達(dá)式才會(huì)發(fā)生計(jì)算。這種特性對(duì)于特別耗時(shí)的計(jì)算操作特別有用,比如打開文件進(jìn)行IO,進(jìn)行網(wǎng)絡(luò)IO等。

import scala.io.Source._lazy val lines = fromFile("C://Users//Administrator//Desktop//test.txt").mkString

即使文件不存在,也不會(huì)報(bào)錯(cuò),只有第一個(gè)使用變量時(shí)會(huì)報(bào)錯(cuò),證明了表達(dá)式計(jì)算的lazy特性。

val lines = fromFile("C://Users//Administrator//Desktop//test.txt").mkStringlazy val lines = fromFile("C://Users//Administrator//Desktop//test.txt").mkStringdef lines = fromFile("C://Users//Administrator//Desktop//test.txt").mkString

(3)?異常

在Scala中,異常處理和捕獲機(jī)制與Java是非常相似的。

try {throw new IllegalArgumentException("x should not be negative")} catch {case _: IllegalArgumentException => println("Illegal Argument!")} finally {print("release resources!")} try {throw new IOException("user defined exception")} catch {case e1: IllegalArgumentException => println("illegal argument")case e2: IOException => println("io exception")}

?

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的Scala与Java差异(三)之函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。