Merge pull request #5416 from chandra1123/BAEL-2041
Bael-2041 Introduction to Scala
This commit is contained in:
commit
b57a14db36
|
@ -64,3 +64,5 @@ jmeter/src/main/resources/*-JMeter.csv
|
|||
**/out-tsc
|
||||
**/nbproject/
|
||||
**/nb-configuration.xml
|
||||
core-scala/.cache-main
|
||||
core-scala/.cache-tests
|
||||
|
|
|
@ -0,0 +1,53 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>core-scala</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>parent-modules</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.scala-lang</groupId>
|
||||
<artifactId>scala-library</artifactId>
|
||||
<version>${scala.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<sourceDirectory>src/main/scala</sourceDirectory>
|
||||
<testSourceDirectory>src/test/scala</testSourceDirectory>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>net.alchim31.maven</groupId>
|
||||
<artifactId>scala-maven-plugin</artifactId>
|
||||
<version>3.3.2</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>compile</goal>
|
||||
<goal>testCompile</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<args>
|
||||
<arg>-dependencyfile</arg>
|
||||
<arg>${project.build.directory}/.scala_dependencies</arg>
|
||||
</args>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<properties>
|
||||
<scala.version>2.12.7</scala.version>
|
||||
</properties>
|
||||
</project>
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
package com.baeldung.scala
|
||||
|
||||
/**
|
||||
* Sample code demonstrating the various control structured.
|
||||
*
|
||||
* @author Chandra Prakash
|
||||
*
|
||||
*/
|
||||
object ControlStructuresDemo {
|
||||
def gcd(x : Int, y : Int) : Int = {
|
||||
if (y == 0) x else gcd(y, x % y)
|
||||
}
|
||||
|
||||
def gcdIter(x : Int, y : Int) : Int = {
|
||||
var a = x
|
||||
var b = y
|
||||
while (b > 0) {
|
||||
a = a % b
|
||||
val t = a
|
||||
a = b
|
||||
b = t
|
||||
}
|
||||
a
|
||||
}
|
||||
|
||||
def rangeSum(a : Int, b : Int) = {
|
||||
var sum = 0;
|
||||
for (i <- a to b) {
|
||||
sum += i
|
||||
}
|
||||
sum
|
||||
}
|
||||
|
||||
def factorial(a : Int) : Int = {
|
||||
var result = 1;
|
||||
var i = 1;
|
||||
do {
|
||||
result *= i
|
||||
i = i + 1
|
||||
} while (i <= a)
|
||||
result
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
package com.baeldung.scala
|
||||
|
||||
/**
|
||||
* Sample Code demonstrating a class.
|
||||
*
|
||||
* @author Chandra Prakash
|
||||
*
|
||||
*/
|
||||
class Employee(val name : String,
|
||||
var salary : Int,
|
||||
annualIncrement : Int = 20) {
|
||||
|
||||
def incrementSalary() : Unit = {
|
||||
salary += annualIncrement
|
||||
}
|
||||
|
||||
override def toString =
|
||||
s"Employee(name=$name, salary=$salary)"
|
||||
}
|
||||
|
||||
/**
|
||||
* A Trait which will make the toString return upper case value.
|
||||
*/
|
||||
trait UpperCasePrinter {
|
||||
override def toString = super.toString toUpperCase
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
package com.baeldung.scala
|
||||
|
||||
object HelloWorld extends App {
|
||||
println("Hello World!")
|
||||
args foreach println
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
package com.baeldung.scala
|
||||
|
||||
/**
|
||||
* Sample higher order functions.
|
||||
*
|
||||
* @author Chandra Prakash
|
||||
*
|
||||
*/
|
||||
object HigherOrderFunctions {
|
||||
|
||||
def mapReduce(r : (Int, Int) => Int,
|
||||
i : Int,
|
||||
m : Int => Int,
|
||||
a : Int, b : Int) = {
|
||||
def iter(a : Int, result : Int) : Int = {
|
||||
if (a > b) result
|
||||
else iter(a + 1, r(m(a), result))
|
||||
}
|
||||
iter(a, i)
|
||||
}
|
||||
|
||||
def whileLoop(condition : => Boolean)(body : => Unit) : Unit =
|
||||
if (condition) {
|
||||
body
|
||||
whileLoop(condition)(body)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
package com.baeldung.scala
|
||||
|
||||
/**
|
||||
* An abstract class for set of integers and its implementation.
|
||||
*
|
||||
* @author Chandra Prakash
|
||||
*
|
||||
*/
|
||||
abstract class IntSet {
|
||||
// add an element to the set
|
||||
def incl(x : Int) : IntSet
|
||||
|
||||
// whether an element belongs to the set
|
||||
def contains(x : Int) : Boolean
|
||||
}
|
||||
|
||||
class EmptyIntSet extends IntSet {
|
||||
|
||||
def contains(x : Int) : Boolean = false
|
||||
|
||||
def incl(x : Int) =
|
||||
new NonEmptyIntSet(x, this)
|
||||
}
|
||||
|
||||
class NonEmptyIntSet(val head : Int, val tail : IntSet)
|
||||
extends IntSet {
|
||||
|
||||
def contains(x : Int) : Boolean =
|
||||
head == x || (tail contains x)
|
||||
|
||||
def incl(x : Int) : IntSet =
|
||||
if (this contains x) this
|
||||
else new NonEmptyIntSet(x, this)
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
package com.baeldung.scala
|
||||
|
||||
/**
|
||||
* Some utility methods.
|
||||
*
|
||||
* @author Chandra Prakash
|
||||
*
|
||||
*/
|
||||
object Utils {
|
||||
def average(x : Double, y : Double) = (x + y) / 2
|
||||
|
||||
def randomLessThan(d : Double) = {
|
||||
var random = 0d
|
||||
do {
|
||||
random = Math.random()
|
||||
} while (random >= d)
|
||||
random
|
||||
}
|
||||
|
||||
def power(x : Int, y : Int) : Int = {
|
||||
def powNested(i : Int, accumulator : Int) : Int = {
|
||||
if (i <= 0) accumulator
|
||||
else powNested(i - 1, x * accumulator)
|
||||
}
|
||||
powNested(y, 1)
|
||||
}
|
||||
|
||||
def fibonacci(n : Int) : Int = n match {
|
||||
case 0 | 1 => 1
|
||||
case x if x > 1 =>
|
||||
fibonacci(x - 1) + fibonacci(x - 2)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
package com.baeldung.scala
|
||||
|
||||
import com.baeldung.scala.ControlStructuresDemo._
|
||||
import org.junit.Test
|
||||
import org.junit.Assert.assertEquals
|
||||
|
||||
class ControlStructuresDemoUnitTest {
|
||||
@Test
|
||||
def givenTwoIntegers_whenGcdCalled_thenCorrectValueReturned = {
|
||||
assertEquals(3, gcd(15, 27))
|
||||
}
|
||||
|
||||
@Test
|
||||
def givenTwoIntegers_whenGcdIterCalled_thenCorrectValueReturned = {
|
||||
assertEquals(3, gcdIter(15, 27))
|
||||
}
|
||||
|
||||
@Test
|
||||
def givenTwoIntegers_whenRangeSumcalled_thenCorrectValueReturned = {
|
||||
assertEquals(55, rangeSum(1, 10))
|
||||
}
|
||||
|
||||
@Test
|
||||
def givenPositiveInteger_whenFactorialInvoked_thenCorrectValueReturned = {
|
||||
assertEquals(720, factorial(6))
|
||||
}
|
||||
|
||||
@Test
|
||||
def whenFactorialOf0Invoked_then1Returned = {
|
||||
assertEquals(1, factorial(0))
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
package com.baeldung.scala
|
||||
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
|
||||
class EmployeeUnitTest {
|
||||
|
||||
@Test
|
||||
def whenEmployeeSalaryIncremented_thenCorrectSalary = {
|
||||
val employee = new Employee("John Doe", 1000)
|
||||
employee.incrementSalary()
|
||||
assertEquals(1020, employee.salary)
|
||||
}
|
||||
|
||||
@Test
|
||||
def givenEmployee_whenToStringCalled_thenCorrectStringReturned = {
|
||||
val employee = new Employee("John Doe", 1000)
|
||||
assertEquals("Employee(name=John Doe, salary=1000)", employee.toString)
|
||||
}
|
||||
|
||||
@Test
|
||||
def givenEmployeeWithTrait_whenToStringCalled_thenCorrectStringReturned = {
|
||||
val employee =
|
||||
new Employee("John Doe", 1000) with UpperCasePrinter
|
||||
assertEquals("EMPLOYEE(NAME=JOHN DOE, SALARY=1000)", employee.toString)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
package com.baeldung.scala
|
||||
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
|
||||
import HigherOrderFunctions.mapReduce
|
||||
|
||||
class HigherOrderFunctionsUnitTest {
|
||||
|
||||
@Test
|
||||
def whenCalledWithSumAndSquareFunctions_thenCorrectValueReturned = {
|
||||
def square(x : Int) = x * x
|
||||
|
||||
def sum(x : Int, y : Int) = x + y
|
||||
|
||||
def sumSquares(a : Int, b : Int) =
|
||||
mapReduce(sum, 0, square, a, b)
|
||||
|
||||
assertEquals(385, sumSquares(1, 10))
|
||||
}
|
||||
|
||||
@Test
|
||||
def whenComputingSumOfSquaresWithAnonymousFunctions_thenCorrectValueReturned = {
|
||||
def sumSquares(a : Int, b : Int) =
|
||||
mapReduce((x, y) => x + y, 0, x => x * x, a, b)
|
||||
|
||||
assertEquals(385, sumSquares(1, 10))
|
||||
}
|
||||
|
||||
@Test
|
||||
def givenCurriedFunctions_whenInvoked_thenCorrectValueReturned = {
|
||||
// a curried function
|
||||
def sum(f : Int => Int)(a : Int,
|
||||
b : Int) : Int =
|
||||
if (a > b) 0 else f(a) + sum(f)(a + 1, b)
|
||||
|
||||
// another curried function
|
||||
def mod(n : Int)(x : Int) = x % n
|
||||
|
||||
// application of a curried function
|
||||
assertEquals(1, mod(5)(6))
|
||||
|
||||
// partial application of curried function
|
||||
// trailing underscore is required to make function type explicit
|
||||
val sumMod5 = sum(mod(5)) _
|
||||
|
||||
assertEquals(10, sumMod5(6, 10))
|
||||
}
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
package com.baeldung.scala
|
||||
|
||||
import scala.Range
|
||||
|
||||
import org.junit.Assert.assertFalse
|
||||
import org.junit.Test
|
||||
|
||||
class IntSetUnitTest {
|
||||
|
||||
@Test
|
||||
def givenSetof1To10_whenContains11Called_thenFalse = {
|
||||
|
||||
// Set up a set containing integers 1 to 10.
|
||||
val set1To10 =
|
||||
Range(1, 10)
|
||||
.foldLeft(new EmptyIntSet() : IntSet) {
|
||||
(x, y) => x incl y
|
||||
}
|
||||
|
||||
assertFalse(set1To10 contains 11)
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
package com.baeldung.scala
|
||||
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Test
|
||||
|
||||
import Utils.average
|
||||
import Utils.fibonacci
|
||||
import Utils.power
|
||||
import Utils.randomLessThan
|
||||
|
||||
class UtilsUnitTest {
|
||||
|
||||
@Test
|
||||
def whenAverageCalled_thenCorrectValueReturned() = {
|
||||
assertEquals(15.0, average(10, 20), 1e-5)
|
||||
}
|
||||
|
||||
@Test
|
||||
def whenRandomLessThanInvokedWithANumber_thenARandomLessThanItReturned = {
|
||||
val d = 0.1
|
||||
assertTrue(randomLessThan(d) < d)
|
||||
}
|
||||
|
||||
@Test
|
||||
def whenPowerInvokedWith2And3_then8Returned = {
|
||||
assertEquals(8, power(2, 3))
|
||||
}
|
||||
|
||||
@Test
|
||||
def whenFibonacciCalled_thenCorrectValueReturned = {
|
||||
assertEquals(1, fibonacci(0))
|
||||
assertEquals(1, fibonacci(1))
|
||||
assertEquals(fibonacci(6),
|
||||
fibonacci(4) + fibonacci(5))
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue