Skip to content

Commit 9c718f8

Browse files
committed
chapter 17
1 parent a545f94 commit 9c718f8

5 files changed

Lines changed: 272 additions & 0 deletions

File tree

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package s4j.scala.chapter17
2+
3+
object Contains extends App {
4+
5+
def containsNegativeNumbers(numbers: List[Int]): Boolean = {
6+
var exists = false
7+
for (number <- numbers)
8+
if (number < 0)
9+
exists = true
10+
exists
11+
}
12+
13+
def containsOddNumbers(numbers: List[Int]): Boolean = {
14+
var exists = false
15+
for (number <- numbers)
16+
if (number % 2 == 1)
17+
exists = true
18+
exists
19+
}
20+
21+
def contains(numbers: List[Int], predicate: Int => Boolean): Boolean = {
22+
var exists = false
23+
for (number <- numbers)
24+
if (predicate(number))
25+
exists = true
26+
exists
27+
}
28+
29+
def contains2(numbers: List[Int])(predicate: Int => Boolean): Boolean = {
30+
var exists = false
31+
for (number <- numbers)
32+
if (predicate(number))
33+
exists = true
34+
exists
35+
}
36+
37+
38+
println(containsNegativeNumbers(List(0, 1, -1, 45)))
39+
println(containsNegativeNumbers(List(0, 1, 9, 45)))
40+
println(containsOddNumbers(List(0, 1, -1, 45)))
41+
println(containsOddNumbers(List(0, 2, 4, 10)))
42+
43+
// using higher order function
44+
val negativeNumbers = (x: Int) => x < 0
45+
println(contains(List(0, 1, -1, 45), negativeNumbers))
46+
println(contains(List(0, 1, 9, 45), negativeNumbers))
47+
48+
val oddNumbers = (x: Int) => x % 2 == 1
49+
println(contains(List(0, 1, -1, 45), oddNumbers))
50+
println(contains(List(0, 2, 4, 10), oddNumbers))
51+
52+
println
53+
println(contains2(List(0, 1, -1, 45)) {
54+
_ < 0
55+
})
56+
println(contains2(List(0, 1, -1, 45)) {
57+
_ % 2 == 1
58+
})
59+
60+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package s4j.scala.chapter17
2+
3+
object Curry extends App {
4+
5+
val a = "a"
6+
val b = "b"
7+
8+
def f(a: String)(b: String): String = a + b
9+
10+
val f2: (String) => String = f(a)
11+
val result: String = f2(b)
12+
13+
val r: String = f(a)(b)
14+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package s4j.scala.chapter17
2+
3+
object Numerals extends App {
4+
5+
val numerals = List("I", "II", "III", "IV", "V", "VI", "VII")
6+
7+
private val function = (value: String) => println(value)
8+
9+
numerals.foreach((value: String) => function(value)) // long hand
10+
numerals.foreach(function(_)) // implicit parameter
11+
numerals.foreach(function) // method value
12+
13+
numerals.foreach((value: String) => println(value)) // long hand
14+
numerals.foreach(println(_)) // implicit parameter
15+
numerals.foreach(println) // method value
16+
17+
}
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
package s4j.scala.chapter17
2+
3+
import s4j.scala.chapter12.{Customer, ShoppingBasket}
4+
import s4j.scala.chapter17.ThreadExample._
5+
6+
object ThreadExample {
7+
8+
def runInThread(function: () => Unit) {
9+
new Thread() {
10+
override def run(): Unit = function() // aka function.apply()
11+
}.start()
12+
}
13+
14+
def runInThread2(function: => Unit) { // call-by-name
15+
new Thread() {
16+
override def run(): Unit = function // not function()
17+
}.start()
18+
}
19+
20+
def runInThread3(group: String, function: => Unit) {
21+
new Thread(new ThreadGroup(group), () => function).start()
22+
}
23+
24+
def runInThread4(group: String)(function: => Unit) {
25+
new Thread(new ThreadGroup(group), () => function).start()
26+
}
27+
28+
def main(args: Array[String]) {
29+
runInThread(() => {
30+
// some long running task
31+
println("Hello function")
32+
})
33+
34+
runInThread2 {
35+
println("Hello Lazy val")
36+
}
37+
}
38+
}
39+
40+
/*
41+
a class representing some kind of UI with 'update' methods
42+
to update itself
43+
*/
44+
class UI {
45+
46+
def updateUiElements() {
47+
new Thread() {
48+
override def run(): Unit = updateCustomerBasket(basket)
49+
}.start()
50+
51+
new Thread() {
52+
override def run(): Unit = updateOffersFor(customer)
53+
}.start()
54+
55+
// more updates, all done in their own threads
56+
}
57+
58+
def updateUiElements2() {
59+
runInThread(() => updateCustomerBasket(basket))
60+
runInThread(() => updateOffersFor(customer))
61+
// more updates, all done in their own threads
62+
}
63+
64+
def updateUiElements3() {
65+
runInThread { () =>
66+
updateCustomerBasket(basket)
67+
}
68+
runInThread { () =>
69+
updateOffersFor(customer)
70+
}
71+
// more updates, all done in their own threads
72+
}
73+
74+
def updateUiElementsX() {
75+
runInThread(() => {
76+
applyDiscountToBasket(basket)
77+
updateCustomerBasket(basket)
78+
})
79+
runInThread(() => updateOffersFor(customer))
80+
// more updates, all done in their own threads
81+
}
82+
83+
def updateUiElements4() {
84+
runInThread2 {
85+
applyDiscountToBasket(basket)
86+
updateCustomerBasket(basket)
87+
}
88+
runInThread2 {
89+
updateOffersFor(customer)
90+
}
91+
// more updates, all done in their own threads
92+
}
93+
94+
def updateUiElements5() {
95+
runInThread3("basket", {
96+
applyDiscountToBasket(basket)
97+
updateCustomerBasket(basket)
98+
})
99+
runInThread3("customer",
100+
updateOffersFor(customer)
101+
)
102+
// more updates, all done in their own threads
103+
}
104+
105+
def updateUiElements6() {
106+
runInThread4("basket") {
107+
applyDiscountToBasket(basket)
108+
updateCustomerBasket(basket)
109+
}
110+
runInThread3("customer",
111+
updateOffersFor(customer)
112+
)
113+
// more updates, all done in their own threads
114+
}
115+
116+
def applyDiscountToBasket(basket: ShoppingBasket) {}
117+
def updateCustomerBasket(basket: ShoppingBasket) {}
118+
def updateOffersFor(customer: Customer) {}
119+
120+
private val basket = new ShoppingBasket()
121+
private val customer = new Customer("", "")
122+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package s4j.scala.chapter17
2+
3+
import java.util.Date
4+
5+
object TimerExample {
6+
7+
def exampleTimer() = {
8+
val timer = new NaiveTimer()
9+
timer.start()
10+
someLongRunningTask()
11+
val time = timer.stop()
12+
println("process took " + time + "ms")
13+
}
14+
15+
def anotherExampleTimer() = {
16+
val timer = Timer()
17+
timer.time {
18+
someLongRunningTask()
19+
null
20+
}
21+
println("process took " + timer + "ms")
22+
}
23+
24+
def yetAnotherExampleTimer() = {
25+
val timer = Timer()
26+
timer.time(() => {
27+
someLongRunningTask()
28+
})
29+
println("process took " + timer + "ms")
30+
}
31+
32+
def someLongRunningTask() = Thread.sleep(1000)
33+
}
34+
35+
class NaiveTimer {
36+
private var startDate: Date = null
37+
38+
def start() = startDate = new Date
39+
40+
def stop(): Long = new Date().getTime - startDate.getTime
41+
}
42+
43+
object Timer {
44+
def apply() = new Timer()
45+
}
46+
47+
class Timer {
48+
49+
private val start = new Date
50+
51+
def time(function: () => Unit) {
52+
try {
53+
function.apply()
54+
} finally {
55+
new Date().getTime - start.getTime
56+
}
57+
}
58+
59+
}

0 commit comments

Comments
 (0)