スカラを設定スカラ関数型プログラミング(C)と機能

主婦:

Scalaの関数型プログラミング(ⅱ)基本的な文法はスカラを記述

Scalaの関数型プログラミング(ⅱ)基本的な文法はスカラを記述

すでに少し共通の構文とオブジェクト指向知識Scalaのいくつかの簡単に説明したように、この時間は、主な機能やコレクションをご紹介します、最後の章を追加します。

注ああ、機能および方法は同じではない、クラスで定義され、別の機能があるかもしれない(厳密に言えば、Scalaの内側、各関数はクラスです)

プレゼンテーションのセット.scala

私たちは、直接手で新しいものにせずに、そのリストを作成するリスト(...)を使用することができるように、それ以前の章オブジェクトのメソッドを適用覚えて、データ構造の多くは、実際に、それを使用していました。

PS:注意、Scalaのデフォルトのデータ構造は不変で、それが一覧で、削除、または新しい要素を追加していません。もちろん、「変数」のデータ構造があり、それは背面に導入されます。

1.1リスト

この方法を適用するためのおかげで、我々は新しいことで新しいデータ構造を作成することはできません。

//通过工厂,新建一个List,这个List是不可变的
scala> val numbers = List(1, 2, 3, 4, 5, 1, 2, 3, 4, 5)
numbers: List[Int] = List(1, 2, 3, 4, 5, 1, 2, 3, 4, 5)

1.2元グループタプル

この概念にPythonでより広くアプリケーションをタプル、それが一緒にパッケージのデータタイプ(INT、文字列、ダブルなど)の様々なことができます

scala> val tup = (1,1,2.1,"tuple",'c')  //将多种不同数据结构打包一起,可以有重复
tup: (Int, Int, Double, String, Char) = (1,1,2.1,tuple,c)

しかし、Scalaで、タプル長が制限されており、それが唯一、最大22個の要素を持つことができタプルです。

scala> val tup = (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21)
tup: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) = (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21)

//一个Tuple超过22个元素,报错了
scala> val tup = (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22)
<console>:1: error: too many elements for tuple: 23, allowed: 22
val tup = (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22)

あなたはタプル一度22個の以上の要素が間違ったレポートになり、上記を参照することができます。このマジックナンバーは22である理由としては、単一の引数ではないだったようです。名前は「ナンバー23」という映画を持っているので、一部の人々は、その23匹の魚を冗談を言った~~

1.3マップとオプション

地図は、オプションの内側に保たれているので、地図を言って前に、我々は、オプションを導入するために後で導入を必要とします。

オプションの変換は、本質的に、それは実際にそれが存在するかを説明しますオプションで、オプションです。または実施例でそれを示しています。

//Option里面可以存普通数据类型
scala> val optionInt = Option(1)
optionInt: Option[Int] = Some(1)

scala> optionInt.get
res8: Int = 1
//但一个Option也可能为空
scala> val optionNone = Option(null)
optionNone: Option[Null] = None
//当Option里面是空的时候,是get不出东西的,还会报错
scala> optionNone.get
java.util.NoSuchElementException: None.get
  at scala.None$.get(Option.scala:347)
  at scala.None$.get(Option.scala:345)
  ... 32 elided
//这个时候可以判断它就是空的
scala> optionNone.isEmpty
res11: Boolean = true
//但可以用getOrElse()方法,当Option里面有东西的时候,就返回那个东西,如果没有东西,就返回getOrElse()的参数的内容
scala> optionNone.getOrElse("this is null")  //里面没东西
res12: String = this is null
scala> optionInt.getOrElse("this is null") //里面有东西
res15: Any = 1

地図のほか、地図のタイプの値を使用すると、割り当てられたデータの種類が、オプションではありません。そのマップ(キー - >オプション、キー1 - >オプション)。

scala> val map = Map("test1" -> 1,"test2" -> 2)
map: scala.collection.immutable.Map[String,Int] = Map(test1 -> 1, test2 -> 2)

scala> map.get("test1")
res16: Option[Int] = Some(1)

scala> map.get("test3")
res17: Option[Int] = None

scala> map.get("test3").getOrElse("this is null")
res18: Any = this is null

この利点は、それが何をしているのですか?内部のJavaを覚えて、それぞれは、javaが空で行う例痛い判断をしなければなりませんでした。Scalaで、すべてのこれらのトラブルは存在しません。オプションで、私の母はもはやNullPointerExceptionが友人を心配する必要はありません。

1.4一般的に使用される機能コンビネータ

無名関数

サブ機能の組み合わせのコレクションは、それは確かに最初の無名関数を持っていました。pythonで使用ラムダ式がある場合、それは、この方法は非常に注意する必要があります。

前述のように関数がオブジェクトである、Scalaは、匿名関数は、関数です。ここでは簡単な例です:

//创建一个匿名函数
scala> val addOne = (x: Int) => x + 1
addOne: (Int) => Int = <function1>

scala> addOne(1)
res4: Int = 2

返すことができない機能は、+ 1をxは、最終的な表面は、匿名関数の戻り値であることに注意してください。

マップ、削減

そのためのHadoopの出現、MapReduceは腐っ言っています。が、HadoopのMapReduceは、機能マップに由来し、削減が、実際には両者は同じではありません。:私は1つを書いた前に興味を見ることができます分割統治アルゴリズムからのHadoopのMapReduceへ

その内部の機能マップは、大まかに言えば、戻り値にはかなりのループ実際にあります。

scala> val list = List(1,2,3)
list: List[Int] = List(1, 2, 3)

scala> list.map(_ + 1)   //这里的(_+1)其实就是一个匿名函数 //让List中每一个元素+1,并返回
res29: List[Int] = List(2, 3, 4)

それを低減するために、それはforループに似ているように、各サイクルは、単に現在の要素、ならびに最後のサイクルの結果を減少させる、または実施例を見てみることに加えて、現在の要素をマッピングしません。

scala> list.reduce((i,j) => i + j)  //两个两个一起循环,这里是让两个相加
res28: Int = 6

上記の例のように、3つの数字1,2,3があります。両者の最初のサイクルは、第二サイクルは3,3の元の結果、3 + 3は6に等しく、結果は6の最後で、1,2,1 + 2が3に等しくなります。

フィルタ

フィルタ名は、イタリアの示唆、フィルタ手段である、ブール値を返す匿名関数でフィルタに渡すことができます。trueを返し偽破棄するリターンを保持しています。

scala> val numbers = List(1, 2, 3, 4)
numbers: List[Int] = List(1, 2, 3, 4)

//过滤出余2等于0的
scala> numbers.filter((i: Int) => i % 2 == 0)
res0: List[Int] = List(2, 4)

foldLeft

これと同様の削減だけでなく、現在の要素、ならびに以前の反復の結果に加えて、横断します。FoldLeft違いは、初期値があるということです。

scala> val numbers = List(1, 2, 3, 4)
numbers: List[Int] = List(1, 2, 3, 4)

//(m: Int, n: Int) => m + n这部分是一个匿名函数
scala> numbers.foldLeft(0)((m: Int, n: Int) => m + n)
res30: Int = 10

二.scala機能

フロントでは関数にあっ導入されているオブジェクトです。なぜこの関数は、直接それを実行することができますか?実際には、このオブジェクトのおかげで、このシンタックスシュガーを適用します。

部分的な機能

部分的な機能(部分写像)は、ある意味で、一部の機能は、Scalaのシンタックスシュガーで非常に重要です。

それは長い道のり部分関数であります:

部分写像[A、B] //タイプAのパラメータを受信し、タイプBのリターンパラメータ

それは、Scalaはキーワードケースを持っていることを言及する価値がある、それは部分的な機能を使用することです。例えば、サブを継続:

//下面的case就是一个偏函数PartialFunction[Int, String]
scala> val one: PartialFunction[Int, String] = { case 1 => "one" }
one: PartialFunction[Int,String] = <function1>

scala> one(1)
res11: String = Int

scala> one("one")
<console>:13: error: type mismatch;
 found   : String("one")
 required: Int
       one("one")

ケースキーワードのマッチタイプまたは値が条件に沿って、満たされていない場合は、エラーになります。内部実装は、私たちがこのような一般的なシンタックスシュガーであることを知って、導入されていません。

そして、この場合には、また、実現Scalaのキーワードパターンマッチング、重要な部分である子供用の靴に興味がある私は、この見ることができます:Scalaのパターン・マッチング詳細な分析を

ここで言うべきことの一般的なアプリケーションは、サブ機能の組み合わせがあり、それは部分関数である必要なパラメータを収集します。のは興味深い例を見てみましょう:

//这个list里面的Any类型
scala> val list:List[Any] = List(1, 3, 5, "seven")
list: List[Any] = List(1, 3, 5, seven)

//使用map会报错,因为map接收的参数是普通函
scala> list.map { case i: Int => i + 1 }
scala.MatchError: seven (of class java.lang.String)
  at $anonfun$1.apply(<console>:13)
  at $anonfun$1.apply(<console>:13)
  at scala.collection.immutable.List.map(List.scala:277)
  ... 32 elided

  //但如果用collect函数就可以,因为collect接收的参数是偏函数,它会自动使用偏函数的一些特性,所以可以自动过滤掉不符合的数据类型
scala> list.collect { case i: Int => i + 1 }
res15: List[Int] = List(2, 4, 6)

部分的な収集、受信したパラメータが関数であるため、自動的にデータ型の自動フィルタリングが一致しない場合、マップを行うことができなかった、部分的な機能の特性を使用します。

アプリケーション機能の一部

塗布手段のいわゆる部分、すなわち、関数が呼び出されたとき、パラメータの一部のみを通過させることができるされています。そして、これはそれを見て、たとえば、新しい関数を生成します。

//定义一个打印两个输出参数的函数
scala> def partial(i:Int,j:Int) : Unit = {
     |     println(i)
     |     println(j)
     | }
partial: (i: Int,j: Int)Unit

//赋一个值给上面那个函数,另一个参数不赋值,生成一个新的函数
scala> val partialFun = partial(5,_:Int)
partialFun: Int => Unit = <function1>

//只要一个参数就可以调用啦
scala> partialFun(10)
5
10

部分的なアプリケーション機能は、主な役割は、コードの再利用は、特定のコードの可読性を向上させることも可能です。

もちろん、より多くの興味深い機会が続く用法は、言ってくるがあります。

関数のカリー化

最初に、カリー化する際に非常に奇妙聞きます。カリー?地獄?

これは個人名であるからだけ後でカレーカレーは音訳であることを知っていた、発明者のカリー化の発明でした。

関数をカリー化する単一のパラメータ(第関数の最初のパラメータ)を受け取り、関数は残りの引数をとり、結果を返し、新しい技術を返す関数に変換する複数のパラメータを受け入れることです。

具体的にそれを使用する方法を見て:

//我们知道函数可以这样定义,让它接收两个参数
scala> def curring(i:Int)(j: Int): Boolean = {false}
curring: (i: Int)(j: Int)Boolean

//可以把这个函数赋值给一个变量,注意变量的类型
scala> val curringVal:(Int => (Int => Boolean)) = curring _
curringVal: Int => (Int => Boolean) = <function1>

//可以让这个变量接收一个参数,又变成另一个函数了
scala> val curringVal_1 = curringVal(5)
curringVal_1: Int => Boolean = <function1>

//再用这个变量接收一个参数,终于能返回结果了
scala> curringVal_1(10)
res32: Boolean = false

カリー化は、実際に呼び出しチェーンなる過程の関数であり、上記のアプリケーション機能の一部は次のようになります。

これは、いくつかの部分は、実際には、これらの機能の主な用途の一つは、機能依存性注入され、それが正確に何を知らないかもしれない見るのは初めてです。関数は、パラメータとしてこの技術によって上部に渡された関数に依存し得ます。限られたスペースには、まずここでは省略して、後述します。

結論:

導入は何かScalaのコレクションであるだけでなく、特性関数のいくつか、リピート機能は、実際にはオブジェクトです。

私は常にいくつかの部分的なルールは、文法として、物事を固定したときに新しいことを学ぶ、視点を持っていました。すべてではないが、ちょうど原則を知って、暗記し、ライン上のマップがあります。

たとえば、関数型プログラミングのスカラ座、またはJava OOPのために、そして、私の意見では馬の前のビットカートで学習関連のプログラミングの哲学を、完成した最初のグラマースクールを持っている必要はありません。

私の一般的なアプローチは、構文について知ってもらうこと、そして言語の本質を学ぶことです。とき、それは、ターゲットの後に、特定のクエリ構文を入れたとき、その後、分からないようになりますが、構文がつまらなくなりました。

これらは、ちょうど私の個人的な見解の一部、そしてBenpianこれが終わっています。

もっと~~

おすすめ

転載: www.cnblogs.com/listenfwind/p/11593498.html