高阶函数练习案例
1、定义一个高阶函数,按照指定的规则对集合里面的每个元素进行操作
def main(args: Array[String]): Unit = {
val arr = Array[String]("java", "python", "scala", "idea")
println(map(arr, _.length).toBuffer)
}
def map(arr: Array[String], operator: String => Int) = {
for (item <- arr) yield {
operator(item)
}
}
2、定义一个高阶函数,按照指定的规则对集合中的所有元素进行聚合
def main(args: Array[String]): Unit = {
val arr = Array[Int](1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
println(reduce(arr, _ + _))
println(reduce(arr, _ * _))
}
def reduce(arr: Array[Int], func: (Int, Int) => Int) = {
var tmp = arr(0)
for (i <- 1 until arr.length) {
tmp = func(tmp, arr(i))
}
tmp
}
3、定义一个高阶函数,按照指定的规则获取指定元素
def main(args: Array[String]): Unit = {
val arr = Array("zhangsan 20 3000", "fang 28 20000", "yire 15 90000")
println(sortBy(arr, _.split(" ")(1).toInt))
println(sortBy(arr, _.split(" ")(2).toInt))
}
def sortBy(arr: Array[String], func: (String) => Int) = {
var tmp = func(arr(0))
var result = arr(0)
for (i <- 1 until arr.length) {
val arrRes = func(arr(i))
if (arrRes > tmp) {
tmp = arrRes
result = arr(i)
}
}
result
}
4、定义一个高阶函数,按照指定的规则对数据进行分组
def main(args: Array[String]): Unit = {
val arr = Array[String]("zhangsan 男 深圳", "lisi 女 深圳", "王五 男 北京")
println(sortBy1(arr, _.split(" ")(1)))
println(sortBy1(arr, _.split(" ")(2)))
println(sortBy2(arr, _.split(" ")(1)))
println(sortBy2(arr, _.split(" ")(2)))
}
def sortBy1(arr: Array[String], func: String => String) ={
val result = new util.HashMap[String, util.ArrayList[String]]
for (elem <- arr) {
val key = func(elem)
if (result.containsKey(key)) {
result.get(key).add(elem)
} else {
val list = new util.ArrayList[String]()
list.add(elem)
result.put(key, list)
}
}
result
}
def sortBy2(arr: Array[String], func: String => String) ={
var result = Map[String, ArrayBuffer[String]]()
for (elem <- arr) {
val key = func(elem)
if (result.contains(key)) {
result(key) += elem
} else {
val list = ArrayBuffer[String]()
list += elem
result += (key -> list)
}
}
result
}
5、定义一个高阶函数,按照指定的规则对数据进行过滤,保留符合要求的数据
def main(args: Array[String]): Unit = {
val arr = Array[Int](10, 2, 4, 6, 1, 81, 13)
println(filter(arr, _ % 2 == 0).toBuffer)
println(filter(arr, _ % 3 == 0).toBuffer)
}
def filter(arr: Array[Int], func: Int => Boolean) = {
for (elem <- arr if func(elem)) yield {
elem.toInt
}
}