Scala-模拟 Map 映射、Filter 过滤、Reduce 聚合

package com.scala.A

import scala.collection.mutable.ArrayBuffer
//----------------------------------------------------------------------------------------------------------------------
/**
 * 需求:模拟 Map 映射、Filter 过滤、Reduce 聚合
 * */
object scala_function_02 {
  def main(args: Array[String]): Unit = {
//----------------------------------------------------------------------------------------------------------------------
    /**
     * (1)map映射
     * 第一个参数为一个Int类型的Array数组,第二个参数为一个函数(Int=>Int),map函数的返回值类型为一个数组(Array[Int])
     **/
    def map(arr: Array[Int], op: Int => Int) = {
      /**
       * 函数体为一个for循环
       * 将遍历过程中处理的结果返回到一个新 Vector 集合中,使用 yield 关键字。注意:开发中很少使用。
       * 此for循环从Array数组中的1开始遍历,遍历1时将1返回到op(1)中,op(1)=1*1=1;遍历2时将2返回到op(2)中,op(2)=2*2=4;
       **/
      for (elem <- arr) yield op(elem)
    }
//----------------------------------------------------------------------------------------------------------------------
    /**
     * 定义一个结果返回值,将map的值赋值给他
     * val result1 = map(Array(1, 2, 3, 4), (x: Int) => {x * x})
     * 采取匿名函数简化原则,因为这里变量不止出现过一次,所以不能省略参数名称用下划线代替
     **/
    val arr = map(Array(1, 2, 3, 4), x => x * x)

    /**
     * 将arr1结果打印输出,输出类型是是一个Array[Int]集合
     * mkString方法,将结果使用逗号进行分割
     **/
    println(arr.mkString(","))
//----------------------------------------------------------------------------------------------------------------------
    /**
     * (2)filter 过滤。有参数,且参数再后面只使用一次,则参数省略且后面参数用_表示
     * 定义一个filter过滤函数
     **/
    def filter(arr: Array[Int], op: Int => Boolean) = {
      /**
       * 定义一个名为arr1、类型为ArrayBuffer[Int]的数组
       **/
      val arr1: ArrayBuffer[Int] = new ArrayBuffer[Int]()

      /**
       * 定义一个for循环,遍历arr,if op(1)
       * append添加元素到arr1数组(arr1数组的类型为ArrayBuffer)
       **/
      for (elem <- arr if op(elem)) {
        arr1.append(elem)
      }
      arr1.toArray
    }
    val arr1 = filter(Array(1, 2, 3, 4), _ % 2 == 1)
    println(arr1.mkString(" "))
//----------------------------------------------------------------------------------------------------------------------
    /**
     * (3)reduce 聚合。有多个参数,且每个参数再后面只使用一次,则参数省略且后面参数用_表示,第 n 个_代表第 n 个参数
     **/
    def reduce(arr: Array[Int], op: (Int, Int) => Int) = {
      var init: Int = arr(0)
      /**
       * until关键字循环表示从1到arr.length(arr数组长度)-1的范围循环,即前闭后开的循环范围
       * */
      for (elem <- 1 until arr.length) {
        init = op(init, elem)
      }
      init
    }
    //val arr2 = reduce(Array(1, 2, 3, 4), (x, y) => x * y)
    val arr2 = reduce(Array(1, 2, 3, 4), _ * _)
    println(arr2)
//----------------------------------------------------------------------------------------------------------------------
  }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文文鑫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值