diff --git a/core-java-modules/core-java-string-operations-8/README.md b/core-java-modules/core-java-string-operations-8/README.md
index 2dce44d217..6598a4b9cc 100644
--- a/core-java-modules/core-java-string-operations-8/README.md
+++ b/core-java-modules/core-java-string-operations-8/README.md
@@ -1,2 +1,2 @@
-
-### Relevant Articles:
+### Relevant Articles:
+>>>>>>> be317465c ([count-upper-lower] count upper/lowercase letters)
diff --git a/core-java-modules/core-java-string-operations-8/pom.xml b/core-java-modules/core-java-string-operations-8/pom.xml
index 2495abccf8..a2f97a93d9 100644
--- a/core-java-modules/core-java-string-operations-8/pom.xml
+++ b/core-java-modules/core-java-string-operations-8/pom.xml
@@ -1,72 +1,34 @@
-
-
- 4.0.0
- core-java-string-operations-8
- core-java-string-operations-8
- jar
-
-
- com.baeldung.core-java-modules
- core-java-modules
- 0.0.1-SNAPSHOT
-
-
-
-
- org.apache.commons
- commons-lang3
- ${apache.commons.lang3.version}
-
-
- org.apache.commons
- commons-text
- ${commons-text.version}
-
-
- org.liquibase
- liquibase-core
- 4.9.1
- test
-
-
- org.junit.jupiter
- junit-jupiter
- 5.8.1
- test
-
-
- org.liquibase
- liquibase-core
- 4.9.1
- test
-
-
- junit
- junit
- 4.13.2
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
-
- ${maven.compiler.source}
- ${maven.compiler.target}
-
-
-
-
-
-
- 11
- 11
- 3.13.0
- 1.10.0
-
-
-
\ No newline at end of file
+
+
+ 4.0.0
+ core-java-string-operations-8
+ core-java-string-operations-8
+ jar
+
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 0.0.1-SNAPSHOT
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+
+
+
+
+
+
+ 11
+ 11
+
+
+
diff --git a/core-java-modules/core-java-string-operations-8/src/test/java/com/baeldung/countupperandlowercasechars/CountUpperAndLowercaseCharsUnitTest.java b/core-java-modules/core-java-string-operations-8/src/test/java/com/baeldung/countupperandlowercasechars/CountUpperAndLowercaseCharsUnitTest.java
new file mode 100644
index 0000000000..cfef8d53ad
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-8/src/test/java/com/baeldung/countupperandlowercasechars/CountUpperAndLowercaseCharsUnitTest.java
@@ -0,0 +1,85 @@
+package com.baeldung.countupperandlowercasechars;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class CountUpperAndLowercaseCharsUnitTest {
+ private static final String MY_STRING = "Hi, Welcome to Baeldung! Let's count letters!";
+ private static final LetterCount EXPECTED = new LetterCount(4, 31);
+
+ @Test
+ void whenIteratingCharArrayCompareAndCount_thenGetExpectedResult() {
+ int upperCnt = 0;
+ int lowerCnt = 0;
+ for (char c : MY_STRING.toCharArray()) {
+ if (c >= 'A' && c <= 'Z') {
+ upperCnt++;
+ }
+ if (c >= 'a' && c <= 'z') {
+ lowerCnt++;
+ }
+ }
+ LetterCount result = new LetterCount(upperCnt, lowerCnt);
+ assertEquals(EXPECTED, result);
+ }
+
+ @Test
+ void whenUsingCharacterIsLowerOrUpperCase_thenGetExpectedResult() {
+ int upperCnt = 0;
+ int lowerCnt = 0;
+ for (char c : MY_STRING.toCharArray()) {
+ if (Character.isUpperCase(c)) {
+ upperCnt++;
+ }
+ if (Character.isLowerCase(c)) {
+ lowerCnt++;
+ }
+ }
+ LetterCount result = new LetterCount(upperCnt, lowerCnt);
+ assertEquals(EXPECTED, result);
+ }
+
+ @Test
+ void whenUsingStreamFilterAndCount_thenGetExpectedResult() {
+ LetterCount result = new LetterCount(
+ (int) MY_STRING.chars().filter(Character::isUpperCase).count(),
+ (int) MY_STRING.chars().filter(Character::isLowerCase).count()
+ );
+ assertEquals(EXPECTED, result);
+ }
+}
+
+class LetterCount {
+ private int uppercaseCnt;
+ private int lowercaseCnt;
+
+ public LetterCount(int uppercaseCnt, int lowercaseCnt) {
+ this.uppercaseCnt = uppercaseCnt;
+ this.lowercaseCnt = lowercaseCnt;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof LetterCount)) {
+ return false;
+ }
+
+ LetterCount that = (LetterCount) o;
+
+ if (uppercaseCnt != that.uppercaseCnt) {
+ return false;
+ }
+ return lowercaseCnt == that.lowercaseCnt;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = uppercaseCnt;
+ result = 31 * result + lowercaseCnt;
+ return result;
+ }
+}
\ No newline at end of file