代码之家  ›  专栏  ›  技术社区  ›  mac01021

在“Any”上应用函数的方法?[复制]

  •  1
  • mac01021  · 技术社区  · 6 年前

    我喜欢用一种经常使用长方法链的样式进行编程,但有时您要应用的转换不是要转换的对象的方法。所以我发现自己在定义:

    class Better[T] (t: T){
      def xform[U](func: T => U) = func(t)
    }
    
    implicit def improve[T](t: T) = new Better(t)
    

    val content = s3.getObject(bucket, key)
                    .getObjectContent
                    .xform(Source.fromInputStream)
                    .mkString
                    .toInt
    

    标准图书馆里有没有类似的设施?如果是这样的话,我应该如何在不使用StackOverflow的情况下发现它呢?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Andrey Tyukin    6 年前

    不是的 ,但这可能是“足够标准的”:对于猫,你应该能够写一些类似的东西

    val content = 
      s3
      .getObject(bucket, key)
      .getObjectContent
      .pure[Id].map(Source.fromInputStream)
      .mkString
      .toInt
    

    pure[Id] 将输入值包装到do nothing中 Id monad,然后将其作为参数传递给 Source.fromInputStream .

    编辑 map ,则调用此方法而不是 Id.map .

    import cats.Id
    import cats.syntax.applicative._
    import cats.syntax.functor._
    
    object Main {
    
      def square(x: Int) = x * x
    
      def main(args: Array[String]): Unit = {
        println(42.pure[Id].map(square))
      }
    }
    

    但是,写

    val content = 
      Source
      .fromInputStream(
        s3
        .getObject(bucket, key)
        .getObjectContent
      )
      .mkString
      .toInt
    

    val content = 
      Source
      .fromInputStream(s3.getObject(bucket, key).getObjectContent)
      .mkString
      .toInt
    

    content s3 .