Scalaでは関数型プログラミング

1.トラバース(foreachの)

方法

foreach(f: (A) ⇒ Unit): Unit

メソッド説明

foreachの API 説明
パラメータ F:(A)⇒ユニット 関数オブジェクトを受け取る
入力パラメータのセットの要素に対して関数を、戻り値はヌルであります
返却値 単位 空の

サンプルコード

// 定义一个列表
 val a = List(1,2,3,4)
 //迭代打印
 a.foreach((x:Int)=>println(x))

ここに画像を挿入説明

簡略化された関数定義を使用して、型推論

リストを反復処理するためのforeachを使用して、リスト内の各要素のタイプが決定されます

  • Scalaは、自動的にパラメータセットの各要素の型を推論することができます
  • あなたが関数を作成すると、そのパラメータリストを入力を省略することができます
サンプルコード
//定义一个列表
 val a = List(1,2,3,4)
 // 省略参数类型
 a.foreach(x=>println(x))

ここに画像を挿入説明

アンダースコアの使用を簡素化するための関数の定義

  • 関数のパラメータは、関数の本体内で一度だけ表示され、その関数が呼び出しをネストされていないときは、関数定義のアンダースコアを簡素化するために使用することができます
  • メソッドのパラメータが関数である場合に表示さ下線場合、Scalaのコンパイラが自動的にコード関数にパッケージ化
  • パラメータリストは、コンパイラのスカラ座で自動的に処理されます
サンプルコード
//定义一个列表
val a = List(1,2,3,4)
//使用下划线简化函数定义
a.foreach(println(_))

ここに画像を挿入説明

2.マッピング(地図)

計算されたデータが他のプロセスのデータ・タイプ、および一組の使用、したがってより多くのマッピング動作、1つのデータ型に変換されると
受信機能のマップ方法を、関数は、各要素、リターンに適用されます新しいリスト

方法

def map[B](f: (A) ⇒ B): TraversableOnce[B]

メソッド説明

マップ方法 API 説明
ジェネリック [B] 最終マップ・メソッドが返すにジェネリックのコレクションを指定します。
パラメータ F:(A)⇒B 関数オブジェクト通過
(変換リスト要素へ)機能タイプAを受信し、タイプBの値を返します
返却値 TraversableOnce [B] セットタイプB

サンプルコード

//1. 创建一个列表,包含元素1,2,3,4
val a = List(1,2,3,4)
//2. 对List中的每一个元素加1
a.map(x=>x+1)
//3.使用下划线来定义函数,对List中的每一个元素加1
a.map(_ + 1)

ここに画像を挿入説明

平坦化3.マッピング(flatMap)

定義

缶flatMap、最初のマップとして理解し、平ら

  • マップはのリストである変換素子一覧です
  • 平坦化フラット全体リスト

方法

def flatMap[B](f: (A) ⇒ GenTraversableOnce[B]): TraversableOnce[B]

メソッド説明

flatmap方法 API 説明
ジェネリック [B] 要素型の最終セットを変換します
パラメータ f: (A) ⇒ GenTraversableOnce[B] 传入一个函数对象
函数的参数是集合的元素
函数的返回值是一个集合
返回值 TraversableOnce[B] B类型的集合

代码示例

//一个文本中包含了若干行,创建一个列表保存这若干行
//"hadoop hive spark flink flume", "kudu hbase sqoop storm"
//获取到文本中每一行中的每一个单词,并将每一个单词都放到列表中
// 定义文本行列表
val a = List("hadoop hive spark flink flume", "kudu hbase sqoop storm")
//使用map将文本行转换为单词数组
 a.map(x=>x.split(" "))
 // 将数组中的扁平化
 a.map(x=>x.split(" ")).flatten

ここに画像を挿入説明

使用flatMap简化操作

代码示例
// 定义文本行列表
val a = List("hadoop hive spark flink flume", "kudu hbase sqoop storm")
//获取到文本中每一行中的每一个单词,并将每一个单词都放到列表中
a.flatMap(_.split(" "))

ここに画像を挿入説明

4.过滤(filter)

过滤符合一定条件的元素

方法

def filter(p: (A) ⇒ Boolean): TraversableOnce[A]

方法说明

filter方法 API 说明
参数 p: (A) ⇒ Boolean 传入一个函数对象
接收一个集合类型的参数
返回布尔类型,满足条件返回true, 不满足返回false
返回值 TraversableOnce[A] 列表

代码示例

//1. 有一个数字列表,元素为:1,2,3,4,5,6,7,8,9  
//过滤出所有的偶数

 List(1,2,3,4,5,6,7,8,9).filter(_ % 2 == 0)

5.是否存在(exists)

方法

def exists(p: (A) ⇒ Boolean): Boolean

方法说明

对集合中的元素进行某个判断,其中之一符合条件则返回true,反之返回false

//1. 有一个数字列表,元素为:1,2,3,4,5,6,7,8,9  

//判断这个数字列表是否有小于 1 的存在
 List(1,2,3,4,5,6,7,8,9).exists(_ < 1)
 //判断这个数字列表是否有大于 1 的存在
 List(1,2,3,4,5,6,7,8,9).exists(_ > 5)

ここに画像を挿入説明

6.排序(sorted、sortBy、sortWith)

在scala集合中,可以使用以下几种方式来进行排序

  • sorted默认排序
  • sortBy指定字段排序
  • sortWith自定义排序

默认排序(升序) (sorted)

代码示例
//1.定义一个列表,包含以下元素: 3, 1, 2, 9, 7
//2.对列表进行升序排序
List(3,1,2,9,7).sorted

ここに画像を挿入説明

指定字段排序 (sortBy)

根据传入的函数转换后,再进行排序

方法
def sortBy[B](f: (A) ⇒ B): List[A]
方法说明
sortBy方法 API 说明
泛型 [B] 按照什么类型来进行排序
参数 f: (A) ⇒ B 传入函数对象
接收一个集合类型的元素参数
返回B类型的元素进行排序
返回值 List[A] 返回排序后的列表
代码示例
//1. 有一个列表,分别包含几行文本的内容:"01 hadoop", "02 flume", "03 hive", "04 spark"
//2. 请按照单词字母进行排序
val a = List("01 hadoop", "02 flume", "03 hive", "04 spark")
//按空格切分,以切分后的第二个元素进行排序
a.sortBy(_.split(" ")(1))

自定义排序 (sortWith)

自定义排序,根据一个函数来进行自定义排序

方法
def sortWith(lt: (A, A) ⇒ Boolean): List[A]
方法说明
sortWith方法 API 说明
参数 lt: (A, A) ⇒ Boolean 传入一个比较大小的函数对象
接收两个集合类型的元素参数
返回两个元素大小,小于返回true,大于返回false
返回值 List[A] 返回排序后的列表
代码示例
//1. 有一个列表,包含以下元素:2,3,1,6,4,5
val a = List(2,3,1,6,4,5)
//2. 使用sortWith对列表进行降序排序
a.sortWith((x,y) => if(x>y)true else false)
//函数参数只在函数中出现一次,可以使用下划线代替
a.sortWith(_ > _)

ここに画像を挿入説明

7.分组(groupBy)

我们如果要将数据按照分组来进行统计分析,就需要使用到分组方法
groupBy表示按照函数将列表分成不同的组

方法

def groupBy[K](f: (A) ⇒ K): Map[K, List[A]]

方法解析

groupBy方法 API 说明
泛型 [K] タイプのグループ化フィールド
パラメータ F:(A)⇒K 通過関数オブジェクト
受信したパラメータセット要素型
キーKの戻り型は、このキーは、グループ内の同じキーをグループ化するために使用されます
返却値 地図[K、リスト[A]] 戻り値のマッピング、Kは、データの対応するセットにこのパケットのパケットフィールド、リストフィールドであります

サンプルコード

//有一个列表,包含了学生的姓名和性别(0代表男 1 代表女):  
//"zhangsan","0"   "lisi","1"  "wangwu","0"
//请按照性别进行分组,统计不同性别的学生人数

//定义一个元组列表来保存学生姓名和性别
val a = List("zhangsan"-> "0", "lisi"->"1", "wangwu"->"0")
//按照性别进行分组 
val b = a.groupBy(_._2)
// 将分组后的映射转换为性别/人数元组列表	
 b.map(x => x._1 -> x._2.size)

計算8.ポリマー(減らします)

重合操作、データのリストを1つに組み合わせることができます。このような動作は、しばしば統計的分析に使用され
、集計計算を通過させるための機能を示すリストを減らします

  • 削減し、一貫性のある結果、左から右に示すReduceLeft
  • reduceRight右から左への計算

方法

def reduce[A1 >: A](op: (A1, A1) ⇒ A1): A1

メソッド説明

メソッドを減らします API 説明
ジェネリック [A1>:A] (下がバインド)要素型A1必見サブクラスのコレクションです
パラメータ :(A1、A1)⇒A1 着信機能オブジェクトのための連続重合操作
最初のタイプのパラメータA1:現在の変数の重合後に
第2のパラメータタイプA1:この要素が重合します
返却値 A1 リスト要素の最終重合

サンプルコード

//定义一个列表,包含以下元素:1,2,3,4,5,6,7,8,9,10
val a = List(1,2,3,4,5,6,7,8,9,10)

// 第一个下划线表示第一个参数,就是历史的聚合数据结果
// 第二个下划线表示第二个参数,就是当前要聚合的数据元素
//使用reduce计算所有元素的和
a.reduce(_ + _)
// 与reduce一样,从左往右计算
a.reduceLeft(_ + _)
// 从右往左聚合计算
 a.reduceRight(_ + _)

ここに画像を挿入説明

9.フォールディング(折りたたみ)

倍と似減らすが、パラメータの指定された初期値以上

  • 左から右にFoldLetと一貫性の倍の効果は、計算を表し、
  • 右から左に計算することはfoldRightを示し、

方法

def fold[A1 >: A](z: A1)(op: (A1, A1) ⇒ A1): A1

メソッド説明

メソッドを減らします API 説明
ジェネリック [A1>:A] (下がバインド)要素型A1必見サブクラスのコレクションです
パラメータ1 Z:A1 初期値
パラメータ2 :(A1、A1)⇒A1 折り畳みの連続運転のためのオブジェクトは、関数に渡される
最初のパラメータはタイプA1である:現在の変数は、折り畳まれた
第二のタイプA1パラメータ:現在の要素を折り畳まれます
返却値 A1 最終的なリストは、折りたたまれた要素であり、

サンプルコード

//定义一个列表,包含以下元素:1,2,3,4,5,6,7,8,9,10
val a = List(1,2,3,4,5,6,7,8,9,10)
//使用fold方法计算所有元素的和
a.fold(0)(_ + _)
a.foldLeft(0)(_ + _)
a.foldRight(0)(_ + _)

ここに画像を挿入説明

公開された88元の記事 ウォンの賞賛114 ビュー2994

おすすめ

転載: blog.csdn.net/hongchenshijie/article/details/104022547