Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PartialFunction問題 #5

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions simple/src/main/main.iml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/scala" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.github.tanacasino.study.nabedge

object
Area extends App {

// area関数は引数として円周率を受け取り、その円周率を使って面積を求める関数を返す。その関数は半径を受け取る

val f1 = area(3.14)
println(f1(10)) // 314.0
println(f1(1)) // 3.14
val f2 = area(3)
println(f2(10)) // 300
println(f2(1)) // 3

def area(pi: Double): (Double) => Double = {
(r: Double) => r * r * pi
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.github.tanacasino.study.nabedge

import scala.util.Try

object Func extends App {

//関数の合成
def functionCompose() = {
val f = (x: Int) => x + 1
val g = (x: Int) => x * 3
val h1 = f compose g
val h2 = g andThen f
assert(h1(10) == 31)
assert(h2(10) == 31)
}
functionCompose()


//任意の数の関数を受け取り
//それらを順に適用する関数を返す関数
def chainFunction(funcs: Function[Int,Int]*) = {
funcs.reduceLeft(_ andThen _)
}
val f1 = (x: Int) => { x + 1 }
val f2 = (x: Int) => { x * 2 }
val f3 = (x: Int) => { x - 1 }
val f4 = chainFunction(f1, f2, f3)
println(f4(10)) // => 21 ならok

/*
Seq[String]とPartialFunctionを受け取り、
各要素に対してPartialFunctionにマッチした場合はその戻り値、
マッチしない場合は元の要素を格納したSeqを返す関数(以下の例のreplace関数)を作ってみよう。
*/
def replace(langs: Seq[String], pf: PartialFunction[String,String]) = {
// langs.map{ lang => Try(pf(lang)).getOrElse(lang) }.toSeq
// langs.map{ lang => if (pf.isDefinedAt(lang)) pf(lang) else lang}.toSeq
}
val langs = Seq("Java", "JavaScript", "Scala")
val result = replace(langs, { case "Scala" => "Cool" })
println(result) // => Seq(Java, JavaScript, Cool)になったらOK!
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.github.tanacasino.study.nabedge

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.{Failure, Success}

object FutureMain extends FutureTrait {

def main(args: Array[String]): Unit = {
// future2()
drill01()
}

}

trait FutureTrait {

// ただのスリープ
def future1() = {
println("Start")
Thread.sleep(5000)
println("end")
}

// Futureによる非同期計算
def future2() = {
println("Start")
val f = Future {
Thread.sleep(5000)
println("Future!!!")
}
println("end")
Thread.sleep(6000)
}

def drill01() = {
val f1 = Future("Hello").map(_.size)
f1.onComplete{
case Success(h) => println(s"f1 success $h")
case Failure(e) => println(s"f1 failed: e")
}
Thread.sleep(5000)
println("*** drill01 END ***")
// val newFuture = Future("new future")
// val f2 = Future("Helloaa").filter(_.size < 5).recoverWith{
// case e: NoSuchElementException => newFuture
// }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.github.tanacasino.study.nabedge

import scala.concurrent.ExecutionContext.Implicits.global

import scala.concurrent.Future

/*
以下のような集計処理を行うメソッドがあるとします。
def aggregate(id: String): Int ={
...
}
このメソッドを使って特定のIDに対する集計結果の合計を求めるコードがあります。
val result = Seq("rikunabi", "mynavi", "en").map { id => aggregate(id) }.sum
ただし、aggregateメソッドは実行に時間がかかるので並列化したいと思います。Futureを使って書き直してみましょう。

*/
object FutureSample {

def aggregate(id: String): Int ={
Thread.sleep(100) // なんか重い処理
id.size
}

def main(args: Array[String]): Unit = {
// val result = Seq("rikunabi", "mynavi", "en").map { id => aggregate(id) }.sum
// println(result)
val result2 = Seq("rikunabi", "mynavi", "en").map(id => Future(aggregate(id)))
val f = Future.reduce(result2)(_ + _)
f.foreach(println)
Thread.sleep(1000)
// println(result2)
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.github.tanacasino.study.nabedge

object Timeit extends App {

def timeIt[A](f:() => A):A = {
val start: Long = System.currentTimeMillis()
println(s"start $start")
val result = f()
val end: Long = System.currentTimeMillis()
val time = end - start
println(s"end $end")
println(s"time $time")
result
}

timeIt ({ () =>
Thread.sleep(100)
println("Hello, World !")
})

/*
// 実行結果が以下のようになる timeit 関数を作ってみよう
//引数にて関数を受け取ればよいのです!
timeit {
Thread.sleep(100)
println("Hello, World!")
}

"""
start: 12345677890
Hello, World!
end: 12345678100
time: 101
"""

*/


}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.github.tanacasino.study.tanacasino.future

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
import scala.concurrent.{Await, Future}
import scala.concurrent.{ExecutionContext, Await, Future}
import scala.util.{Failure, Success}


Expand Down Expand Up @@ -37,7 +37,11 @@ trait Future1 {
// Futureによる非同期計算
def future2() = {
println("Start")

// object MyObject {
// def apply[T](f: => T)(implicit val ec: ExecutionContext): T = {
// f
// }
// }
val f = Future {
Thread.sleep(5000)
println("Future!!!")
Expand Down
11 changes: 11 additions & 0 deletions simple/src/test/test.iml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/scala" isTestSource="true" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>