Skip to content

Commit 4b044a5

Browse files
authored
Merge pull request #46 from rcardin/feature/SCALA-46
SCALA-46 A Comprehensive Guide to For-comprehension in Scala
2 parents 1761e96 + a1f3b2e commit 4b044a5

File tree

2 files changed

+119
-0
lines changed

2 files changed

+119
-0
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.baedung.scala.forcomprehension;
2+
3+
import java.util.Arrays;
4+
import java.util.List;
5+
6+
public class ForComprehension {
7+
public static void main(String[] args) {
8+
final List<TestResult> results =
9+
Arrays.asList(
10+
new TestResult("test 1",10, 10),
11+
new TestResult("test 2",2, 6)
12+
);
13+
int totalPassedAssertsInSucceededTests = 0;
14+
for (int i = 0; i < results.size(); i++) {
15+
final TestResult result = results.get(i);
16+
if (result.isSucceeded()) {
17+
totalPassedAssertsInSucceededTests += result.getSuccessfulAsserts();
18+
}
19+
}
20+
21+
final long totalPassedAssertsInSucceededTests1 =
22+
results.stream()
23+
.filter(TestResult::isSucceeded)
24+
.mapToInt(TestResult::getSuccessfulAsserts)
25+
.sum();
26+
}
27+
28+
private static class TestResult {
29+
private String id;
30+
private boolean succeeded;
31+
private int successfulAsserts;
32+
private int totalAsserts;
33+
34+
public TestResult(String id, int successfulAsserts, int totalAsserts) {
35+
this.id = id;
36+
this.succeeded = successfulAsserts == totalAsserts;
37+
this.successfulAsserts = successfulAsserts;
38+
this.totalAsserts = totalAsserts;
39+
}
40+
41+
public String getId() {
42+
return id;
43+
}
44+
45+
public boolean isSucceeded() {
46+
return succeeded;
47+
}
48+
49+
public int getSuccessfulAsserts() {
50+
return successfulAsserts;
51+
}
52+
53+
public int getTotalAsserts() {
54+
return totalAsserts;
55+
}
56+
}
57+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.baeldung.scala.forcomprehension
2+
3+
object ForComprehension {
4+
5+
val results = List(TestResult("test 1", 10, 10), TestResult("test 2", 2, 6))
6+
val executionTimeList = List(("test 1", 100), ("test 2", 230))
7+
val listOfPassedAssertsInSucceededTests: List[Int] =
8+
for {
9+
result <- results
10+
if result.succeeded
11+
} yield result.successfulAsserts
12+
val passedAssertsInSucceededTests: Int = listOfPassedAssertsInSucceededTests.sum
13+
14+
val numberOfAssertsWithExecutionTime: List[(String, Int, Int)] =
15+
for {
16+
result <- results
17+
(id, time) <- executionTimeList
18+
if result.id == id
19+
} yield (id, result.totalAsserts, time)
20+
21+
val hugeNumberOfAssertsForATest: Int = 10
22+
val resultsWithAHugeAmountOfAsserts: List[TestResult] =
23+
for {
24+
result <- results
25+
if result.totalAsserts >= hugeNumberOfAssertsForATest
26+
} yield result
27+
28+
case class TestResult(id: String, successfulAsserts: Int, totalAsserts: Int) {
29+
def succeeded: Boolean = successfulAsserts == totalAsserts
30+
}
31+
32+
val result: Result[Int] = Result(42)
33+
for {
34+
res <- result
35+
} println(s"The result is $res")
36+
37+
val magic: Int = 42
38+
for {
39+
res <- result
40+
} yield res * magic
41+
42+
val anotherResult: Result[Int] = Result(10)
43+
result
44+
.flatMap(res =>
45+
anotherResult
46+
.map(another => res + another)
47+
)
48+
49+
for {
50+
res <- result
51+
if res == 10
52+
} yield res
53+
54+
case class Result[A](result: A) {
55+
def foreach(f: A => Unit): Unit = f(result)
56+
def map[B](f: A => B): Result[B] = Result(f(result))
57+
def flatMap[B](f: A => Result[B]): Result[B] = f(result)
58+
def withFilter(f: A => Boolean): Result[_] = if (f(result)) this else EmptyResult
59+
}
60+
61+
object EmptyResult extends Result[Null](null)
62+
}

0 commit comments

Comments
 (0)