zoukankan      html  css  js  c++  java
  • Scala中apply的用法

    Scala中的 apply 方法有着不同的含义, 对于函数来说该方法意味着调用function本身, 以下说明摘自Programming in Scala, 3rd Edition

    Every function value is an instance of some class that extends one of several FunctionN traits in package scala, such as Function0 for functions with no parameters, Function1 for functions with one parameter, and so on. Each FunctionN trait has an apply method used to invoke the function.

    在Scala语言中, 函数也是对象, 每一个对象都是scala.FunctionN(1-22)的实例, 其中N是函数参数的数量, 例如我们定义一个函数并复制给一个变量:

    scala> val f = (x: Int) => x + 1
    f: Int => Int = <function1>

     这里定义了一个接收一个整型变量作为参数的函数, 函数的功能是返回输入参数加1. 可以看到REPL返回参数的toString方法 即 <function0> . 那么如果我们有一个指向函数对象的引用, 我们该如何调用这个函数呢? 答案是通过FunctionN的 apply 方法, 即 FunctionN.apply() , 因此调用函数对象的方法如下: 

    scala> f.apply(3)
    res2: Int = 4

    但是如果每次调用方法对象都要通过FunctionN.apply(x, y...), 就会略显啰嗦, Scala提供一种模仿函数调用的格式来调用函数对象

    scala> f(3)
    res3: Int = 4

    应用场景

    工厂方法

    在Scala中可以通过 List.apply(1, 2, 3) 创建一个List对象, apply方法定义在List类的伴生对象中, 像之前所说的, 我们可以简化apply方法, 直接通过 List(1, 2, 3) 创建一个List实例.

    集合类

    Scala集合一文中提到过Iterator迭代器的几个子trait包括Seq, Set, Map都继承PartialFunction并实现了apply方法, 不同的是实现的方式不一样, 我们可以通过下面的例子来说明apply的应用

    scala> Seq(1, 2, 3).apply(1) // 检索
    res6: Int = 2
    
    scala> Set(1, 2, 3).apply(2) // 判断是否存在
    res7: Boolean = true
    
    scala> Map("china" -> "beijing", "US" -> "Washington").apply("US") // 根据键查找值
    res8: String = Washington
    
    scala> Set(1, 2, 3)(2)
    res9: Boolean = true
    
    scala> Set(1, 2, 3)(2)
    res10: Boolean = true
    
    scala> Map("china" -> "beijing", "US" -> "Washington")("US")
    res11: String = Washington

    关于apply的更多应用场景待后续慢慢积累, 以下这篇文章很好的解释了apply的作用

    http://stackoverflow.com/questions/9737352/what-is-the-apply-function-in-scala

  • 相关阅读:
    剑指offer(第2版)刷题 Python版汇总
    git学习笔记
    Python中的lambda、map和filter
    算法题 22 折纸问题 (牛客网,今日头条)
    算法题 21 findNSum (好未来,LeetCode,牛客网)
    算法题 20 或与加
    Python的内存管理机制
    【算法题12 解码方法decode way】
    理解循环神经网络的来龙去脉
    机器学习资源个人汇总
  • 原文地址:https://www.cnblogs.com/ayning/p/5946254.html
Copyright © 2011-2022 走看看