diff --git a/.gitignore b/.gitignore
index 7fe2778755..0e71421ee7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -63,4 +63,6 @@ jmeter/src/main/resources/*-JMeter.csv
**/tmp
**/out-tsc
**/nbproject/
-**/nb-configuration.xml
\ No newline at end of file
+**/nb-configuration.xml
+core-scala/.cache-main
+core-scala/.cache-tests
diff --git a/core-scala/pom.xml b/core-scala/pom.xml
new file mode 100644
index 0000000000..eb7c1c3330
--- /dev/null
+++ b/core-scala/pom.xml
@@ -0,0 +1,53 @@
+
+
+ 4.0.0
+ core-scala
+ 1.0-SNAPSHOT
+ jar
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.scala-lang
+ scala-library
+ ${scala.version}
+
+
+
+
+ src/main/scala
+ src/test/scala
+
+
+ net.alchim31.maven
+ scala-maven-plugin
+ 3.3.2
+
+
+
+ compile
+ testCompile
+
+
+
+ -dependencyfile
+ ${project.build.directory}/.scala_dependencies
+
+
+
+
+
+
+
+
+
+ 2.12.7
+
+
+
diff --git a/core-scala/src/main/scala/com/baeldung/scala/ControlStructuresDemo.scala b/core-scala/src/main/scala/com/baeldung/scala/ControlStructuresDemo.scala
new file mode 100644
index 0000000000..7c1281e573
--- /dev/null
+++ b/core-scala/src/main/scala/com/baeldung/scala/ControlStructuresDemo.scala
@@ -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
+ }
+
+}
\ No newline at end of file
diff --git a/core-scala/src/main/scala/com/baeldung/scala/Employee.scala b/core-scala/src/main/scala/com/baeldung/scala/Employee.scala
new file mode 100644
index 0000000000..397f166aa7
--- /dev/null
+++ b/core-scala/src/main/scala/com/baeldung/scala/Employee.scala
@@ -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
+}
+
diff --git a/core-scala/src/main/scala/com/baeldung/scala/HelloWorld.scala b/core-scala/src/main/scala/com/baeldung/scala/HelloWorld.scala
new file mode 100644
index 0000000000..b3f0ce09a5
--- /dev/null
+++ b/core-scala/src/main/scala/com/baeldung/scala/HelloWorld.scala
@@ -0,0 +1,6 @@
+package com.baeldung.scala
+
+object HelloWorld extends App {
+ println("Hello World!")
+ args foreach println
+}
diff --git a/core-scala/src/main/scala/com/baeldung/scala/HigherOrderFunctions.scala b/core-scala/src/main/scala/com/baeldung/scala/HigherOrderFunctions.scala
new file mode 100644
index 0000000000..df97013206
--- /dev/null
+++ b/core-scala/src/main/scala/com/baeldung/scala/HigherOrderFunctions.scala
@@ -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)
+ }
+}
\ No newline at end of file
diff --git a/core-scala/src/main/scala/com/baeldung/scala/IntSet.scala b/core-scala/src/main/scala/com/baeldung/scala/IntSet.scala
new file mode 100644
index 0000000000..f1a5722a4e
--- /dev/null
+++ b/core-scala/src/main/scala/com/baeldung/scala/IntSet.scala
@@ -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)
+}
\ No newline at end of file
diff --git a/core-scala/src/main/scala/com/baeldung/scala/Utils.scala b/core-scala/src/main/scala/com/baeldung/scala/Utils.scala
new file mode 100644
index 0000000000..93cd3e697e
--- /dev/null
+++ b/core-scala/src/main/scala/com/baeldung/scala/Utils.scala
@@ -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)
+ }
+}
\ No newline at end of file
diff --git a/core-scala/src/test/scala/com/baeldung/scala/ControlStructuresDemoUnitTest.scala b/core-scala/src/test/scala/com/baeldung/scala/ControlStructuresDemoUnitTest.scala
new file mode 100644
index 0000000000..71422a8b4f
--- /dev/null
+++ b/core-scala/src/test/scala/com/baeldung/scala/ControlStructuresDemoUnitTest.scala
@@ -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))
+ }
+
+}
\ No newline at end of file
diff --git a/core-scala/src/test/scala/com/baeldung/scala/EmployeeUnitTest.scala b/core-scala/src/test/scala/com/baeldung/scala/EmployeeUnitTest.scala
new file mode 100644
index 0000000000..c51631dd2c
--- /dev/null
+++ b/core-scala/src/test/scala/com/baeldung/scala/EmployeeUnitTest.scala
@@ -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)
+ }
+
+}
+
+
diff --git a/core-scala/src/test/scala/com/baeldung/scala/HigherOrderFunctionsUnitTest.scala b/core-scala/src/test/scala/com/baeldung/scala/HigherOrderFunctionsUnitTest.scala
new file mode 100644
index 0000000000..63530ecaf4
--- /dev/null
+++ b/core-scala/src/test/scala/com/baeldung/scala/HigherOrderFunctionsUnitTest.scala
@@ -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))
+ }
+}
\ No newline at end of file
diff --git a/core-scala/src/test/scala/com/baeldung/scala/IntSetUnitTest.scala b/core-scala/src/test/scala/com/baeldung/scala/IntSetUnitTest.scala
new file mode 100644
index 0000000000..5cc19e9215
--- /dev/null
+++ b/core-scala/src/test/scala/com/baeldung/scala/IntSetUnitTest.scala
@@ -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)
+ }
+
+}
\ No newline at end of file
diff --git a/core-scala/src/test/scala/com/baeldung/scala/UtilsUnitTest.scala b/core-scala/src/test/scala/com/baeldung/scala/UtilsUnitTest.scala
new file mode 100644
index 0000000000..47f9873aad
--- /dev/null
+++ b/core-scala/src/test/scala/com/baeldung/scala/UtilsUnitTest.scala
@@ -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))
+ }
+}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index eb80a594d8..0b5cd16ea0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -386,6 +386,7 @@
guava-modules/guava-21
guice
disruptor
+ core-scala
spring-static-resources
hazelcast
persistence-modules/hbase