diff --git a/.github/ISSUE_TEMPLATE/issue_report.md b/.github/ISSUE_TEMPLATE/issue_report.md
index 725ae12064..4bc8c8121c 100644
--- a/.github/ISSUE_TEMPLATE/issue_report.md
+++ b/.github/ISSUE_TEMPLATE/issue_report.md
@@ -5,7 +5,7 @@ title: '[ISSUE] '
---
**Article and Module Links**
-A link to the affected article and the affected module. The link to the module is the one in the "over on GitHub" standard phrase.
+A link to the affected article and the affected module. You can find the link to the module in the Conclusion section in the "on Github" standard phase.
**Describe the Issue**
A clear and concise description of what the issue is.
@@ -30,9 +30,3 @@ If applicable, add screenshots to help explain your problem.
**Additional Context**
Add any other context about the issue here.
-
-Note that, unfortunately, we can only help with issues that are specifically and directly related to the article - not with your own, custom application.
-
-StackOverflow is a great place to ask more general questions.
-
-That's primarily because we get a large number of questions and - while we do try to go through as much as everything and help wherever we can, we can't really get back to all of them.
\ No newline at end of file
diff --git a/apache-poi-3/README.md b/apache-poi-3/README.md
new file mode 100644
index 0000000000..9e9d6a94eb
--- /dev/null
+++ b/apache-poi-3/README.md
@@ -0,0 +1,3 @@
+## Relevant Articles
+- [How To Convert Excel Data Into List Of Java Objects](https://www.baeldung.com/java-convert-excel-data-into-list)
+- [Expand Columns with Apache POI](https://www.baeldung.com/java-apache-poi-expand-columns)
diff --git a/core-java-modules/core-java-16/README.md b/core-java-modules/core-java-16/README.md
index b2740d194c..11b0fba8d3 100644
--- a/core-java-modules/core-java-16/README.md
+++ b/core-java-modules/core-java-16/README.md
@@ -5,3 +5,4 @@
- [Collecting Stream Elements into a List in Java](https://www.baeldung.com/java-stream-to-list-collecting)
- [New Features in Java 16](https://www.baeldung.com/java-16-new-features)
- [Guide to Java 8 groupingBy Collector](https://www.baeldung.com/java-groupingby-collector)
+- [Value-Based Classes in Java](https://www.baeldung.com/java-value-based-classes)
diff --git a/core-java-modules/core-java-21/README.md b/core-java-modules/core-java-21/README.md
index 2e7130c906..2c51db275a 100644
--- a/core-java-modules/core-java-21/README.md
+++ b/core-java-modules/core-java-21/README.md
@@ -1,2 +1,3 @@
## Relevant Articles
- [Sequenced Collections in Java 21](https://www.baeldung.com/java-21-sequenced-collections)
+- [String Templates in Java 21](https://www.baeldung.com/java-21-string-templates)
diff --git a/core-java-modules/core-java-21/pom.xml b/core-java-modules/core-java-21/pom.xml
index 0504f787c6..7b8fa9063f 100644
--- a/core-java-modules/core-java-21/pom.xml
+++ b/core-java-modules/core-java-21/pom.xml
@@ -12,6 +12,12 @@
0.0.1-SNAPSHOT
+
+ 21
+ 21
+ UTF-8
+
+
@@ -20,14 +26,22 @@
21
21
- --enable-preview
+
+ false
+
+ --enable-preview
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+ --enable-preview
+
+
+
-
- 21
- 21
- UTF-8
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/unnamed/variables/Car.java b/core-java-modules/core-java-21/src/main/java/com/baeldung/unnamed/variables/Car.java
new file mode 100644
index 0000000000..8f51c03539
--- /dev/null
+++ b/core-java-modules/core-java-21/src/main/java/com/baeldung/unnamed/variables/Car.java
@@ -0,0 +1,11 @@
+package com.baeldung.unnamed.variables;
+
+public record Car(String name, String color, T engine) { }
+
+abstract class Engine { }
+
+class GasEngine extends Engine { }
+
+class ElectricEngine extends Engine { }
+
+class HybridEngine extends Engine { }
\ No newline at end of file
diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/unnamed/variables/UnnamedPatterns.java b/core-java-modules/core-java-21/src/main/java/com/baeldung/unnamed/variables/UnnamedPatterns.java
new file mode 100644
index 0000000000..310ce621f9
--- /dev/null
+++ b/core-java-modules/core-java-21/src/main/java/com/baeldung/unnamed/variables/UnnamedPatterns.java
@@ -0,0 +1,50 @@
+package com.baeldung.unnamed.variables;
+
+public class UnnamedPatterns {
+
+ static String getObjectsColorWithNamedPattern(Object object) {
+ if (object instanceof Car(String name, String color, Engine engine)) {
+ return color;
+ }
+ return "No color!";
+ }
+
+ static String getObjectsColorWithUnnamedPattern(Object object) {
+ if (object instanceof Car(_, String color, _)) {
+ return color;
+ }
+ return "No color!";
+ }
+
+ static String getObjectsColorWithSwitchAndNamedPattern(Object object) {
+ return switch (object) {
+ case Car(String name, String color, Engine engine) -> color;
+ default -> "No color!";
+ };
+ }
+
+ static String getObjectsColorWithSwitchAndUnnamedPattern(Object object) {
+ return switch (object) {
+ case Car(_, String color, _) -> color;
+ default -> "No color!";
+ };
+ }
+
+ static String getEngineTypeWithNamedPattern(Car> car) {
+ return switch (car) {
+ case Car(String name, String color, GasEngine engine) -> "gas";
+ case Car(String name, String color, ElectricEngine engine) -> "electric";
+ case Car(String name, String color, HybridEngine engine) -> "hybrid";
+ default -> "none";
+ };
+ }
+
+ static String getEngineTypeWithUnnamedPattern(Car> car) {
+ return switch (car) {
+ case Car(_, _, GasEngine _) -> "gas";
+ case Car(_, _, ElectricEngine _) -> "electric";
+ case Car(_, _, HybridEngine _) -> "hybrid";
+ default -> "none";
+ };
+ }
+}
diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/unnamed/variables/UnnamedVariables.java b/core-java-modules/core-java-21/src/main/java/com/baeldung/unnamed/variables/UnnamedVariables.java
new file mode 100644
index 0000000000..82e76b40a4
--- /dev/null
+++ b/core-java-modules/core-java-21/src/main/java/com/baeldung/unnamed/variables/UnnamedVariables.java
@@ -0,0 +1,134 @@
+package com.baeldung.unnamed.variables;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Queue;
+
+class Transaction implements AutoCloseable {
+
+ @Override
+ public void close() {
+ System.out.println("Closed!");
+ }
+}
+
+public class UnnamedVariables {
+
+ static int countCarsOverLimitWithNamedVariable(Collection> cars, int limit) {
+ var total = 0;
+ var totalOverLimit = 0;
+ for (var car : cars) {
+ total++;
+ if (total > limit) {
+ totalOverLimit++;
+ // side effect
+ }
+ }
+ return totalOverLimit;
+ }
+
+ static int countCarsOverLimitWithUnnamedVariable(Collection> cars, int limit) {
+ var total = 0;
+ var totalOverLimit = 0;
+ for (var _ : cars) {
+ total++;
+ if (total > limit) {
+ totalOverLimit++;
+ // side effect
+ }
+ }
+ return totalOverLimit;
+ }
+
+ static void sendNotificationToCarsWithNamedVariable(Collection> cars) {
+ sendOneTimeNotification();
+ for (int i = 0; i < cars.size(); i++) {
+ // Notify car
+ }
+ }
+
+ static void sendNotificationToCarsWithUnnamedVariable(Collection> cars) {
+ for (int i = 0, _ = sendOneTimeNotification(); i < cars.size(); i++) {
+ // Notify car
+ }
+ }
+
+ private static int sendOneTimeNotification() {
+ System.out.println("Sending one time notification!");
+ return 1;
+ }
+
+ static Car> removeThreeCarsAndReturnFirstRemovedWithNamedVariables(Queue> cars) {
+ var x = cars.poll();
+ var y = cars.poll();
+ var z = cars.poll();
+ return x;
+ }
+
+ static Car> removeThreeCarsAndReturnFirstRemovedWithUnnamedVariables(Queue> cars) {
+ var car = cars.poll();
+ var _ = cars.poll();
+ var _ = cars.poll();
+ return car;
+ }
+
+ static void handleCarExceptionWithNamedVariables(Car> car) {
+ try {
+ someOperationThatFails(car);
+ } catch (IllegalStateException ex) {
+ System.out.println("Got an illegal state exception for: " + car.name());
+ } catch (RuntimeException ex) {
+ System.out.println("Got a runtime exception!");
+ }
+ }
+
+ static void handleCarExceptionWithUnnamedVariables(Car> car) {
+ try {
+ someOperationThatFails(car);
+ } catch (IllegalStateException | NumberFormatException _) {
+ System.out.println("Got an illegal state exception for: " + car.name());
+ } catch (RuntimeException _) {
+ System.out.println("Got a runtime exception!");
+ }
+ }
+
+ static void obtainTransactionAndUpdateCarWithNamedVariables(Car> car) {
+ try (var transaction = new Transaction()) {
+ updateCar(car);
+ }
+ }
+
+ static void obtainTransactionAndUpdateCarWithUnnamedVariables(Car> car) {
+ try (var _ = new Transaction()) {
+ updateCar(car);
+ }
+ }
+
+ static void updateCar(Car> car) {
+ // Some update logic
+ System.out.println("Car updated!");
+ }
+
+ static Map>> getCarsByFirstLetterWithNamedVariables(List> cars) {
+ Map>> carMap = new HashMap<>();
+ cars.forEach(car ->
+ carMap.computeIfAbsent(car.name().substring(0, 1), firstLetter -> new ArrayList<>()).add(car)
+ );
+ return carMap;
+ }
+
+ static Map>> getCarsByFirstLetterWithUnnamedVariables(List> cars) {
+ Map>> carMap = new HashMap<>();
+ cars.forEach(car ->
+ carMap.computeIfAbsent(car.name().substring(0, 1), _ -> new ArrayList<>()).add(car)
+ );
+ return carMap;
+ }
+
+ private static void someOperationThatFails(Car> car) {
+ throw new IllegalStateException("Triggered exception for: " + car.name());
+ }
+}
diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/unnamedclasses/HelloWorld.java b/core-java-modules/core-java-21/src/main/java/com/baeldung/unnamedclasses/HelloWorld.java
new file mode 100644
index 0000000000..bf0e2c96c2
--- /dev/null
+++ b/core-java-modules/core-java-21/src/main/java/com/baeldung/unnamedclasses/HelloWorld.java
@@ -0,0 +1,3 @@
+void main() {
+ System.out.println("Hello, World!");
+}
diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/unnamedclasses/HelloWorldChild.java b/core-java-modules/core-java-21/src/main/java/com/baeldung/unnamedclasses/HelloWorldChild.java
new file mode 100644
index 0000000000..827be7c788
--- /dev/null
+++ b/core-java-modules/core-java-21/src/main/java/com/baeldung/unnamedclasses/HelloWorldChild.java
@@ -0,0 +1,7 @@
+package com.baeldung.unnamedclasses;
+
+public class HelloWorldChild extends HelloWorldSuper {
+ void main() {
+ System.out.println("Hello, World!");
+ }
+}
diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/unnamedclasses/HelloWorldSuper.java b/core-java-modules/core-java-21/src/main/java/com/baeldung/unnamedclasses/HelloWorldSuper.java
new file mode 100644
index 0000000000..59c88716a4
--- /dev/null
+++ b/core-java-modules/core-java-21/src/main/java/com/baeldung/unnamedclasses/HelloWorldSuper.java
@@ -0,0 +1,7 @@
+package com.baeldung.unnamedclasses;
+
+public class HelloWorldSuper {
+ public static void main(String[] args) {
+ System.out.println("Hello from the superclass");
+ }
+}
diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/unnamedclasses/HelloWorldWithMethod.java b/core-java-modules/core-java-21/src/main/java/com/baeldung/unnamedclasses/HelloWorldWithMethod.java
new file mode 100644
index 0000000000..698516544e
--- /dev/null
+++ b/core-java-modules/core-java-21/src/main/java/com/baeldung/unnamedclasses/HelloWorldWithMethod.java
@@ -0,0 +1,6 @@
+private String getMessage() {
+ return "Hello, World!";
+}
+void main() {
+ System.out.println(getMessage());
+}
diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/unnamed/variables/CarScenario.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/unnamed/variables/CarScenario.java
new file mode 100644
index 0000000000..2acb83cdef
--- /dev/null
+++ b/core-java-modules/core-java-21/src/test/java/com/baeldung/unnamed/variables/CarScenario.java
@@ -0,0 +1,13 @@
+package com.baeldung.unnamed.variables;
+
+import java.util.List;
+
+class CarScenario {
+
+ protected final List> cars = List.of(
+ new Car<>("Mitsubishi", "blue", new GasEngine()),
+ new Car<>("Toyota", "red", new ElectricEngine()),
+ new Car<>("Jaguar", "white", new HybridEngine())
+ );
+
+}
diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/unnamed/variables/UnnamedPatternsUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/unnamed/variables/UnnamedPatternsUnitTest.java
new file mode 100644
index 0000000000..9d860a201a
--- /dev/null
+++ b/core-java-modules/core-java-21/src/test/java/com/baeldung/unnamed/variables/UnnamedPatternsUnitTest.java
@@ -0,0 +1,44 @@
+package com.baeldung.unnamed.variables;
+
+import static com.baeldung.unnamed.variables.UnnamedPatterns.getEngineTypeWithNamedPattern;
+import static com.baeldung.unnamed.variables.UnnamedPatterns.getEngineTypeWithUnnamedPattern;
+import static com.baeldung.unnamed.variables.UnnamedPatterns.getObjectsColorWithNamedPattern;
+import static com.baeldung.unnamed.variables.UnnamedPatterns.getObjectsColorWithSwitchAndNamedPattern;
+import static com.baeldung.unnamed.variables.UnnamedPatterns.getObjectsColorWithSwitchAndUnnamedPattern;
+import static com.baeldung.unnamed.variables.UnnamedPatterns.getObjectsColorWithUnnamedPattern;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+public class UnnamedPatternsUnitTest extends CarScenario {
+
+ @Test
+ public void whenExtractingColorWithNamedPatterns_thenReturnBlue() {
+ assertEquals("blue", getObjectsColorWithNamedPattern(cars.get(0)));
+ }
+
+ @Test
+ public void whenExtractingColorWithUnnamedPatterns_thenReturnBlue() {
+ assertEquals("blue", getObjectsColorWithUnnamedPattern(cars.get(0)));
+ }
+
+ @Test
+ public void whenExtractingColorWithSwitchAndNamedPatterns_thenReturnBlue() {
+ assertEquals("blue", getObjectsColorWithSwitchAndNamedPattern(cars.get(0)));
+ }
+
+ @Test
+ public void whenExtractingColorWithSwitchAndUnnamedPatterns_thenReturnBlue() {
+ assertEquals("blue", getObjectsColorWithSwitchAndUnnamedPattern(cars.get(0)));
+ }
+
+ @Test
+ public void whenExtractingEngineTypeWithNamedPatterns_thenReturnGas() {
+ assertEquals("gas", getEngineTypeWithNamedPattern(cars.get(0)));
+ }
+
+ @Test
+ public void whenExtractingEngineTypeWithUnnamedPatterns_thenReturnGas() {
+ assertEquals("gas", getEngineTypeWithUnnamedPattern(cars.get(0)));
+ }
+}
diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/unnamed/variables/UnnamedVariablesUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/unnamed/variables/UnnamedVariablesUnitTest.java
new file mode 100644
index 0000000000..094879c277
--- /dev/null
+++ b/core-java-modules/core-java-21/src/test/java/com/baeldung/unnamed/variables/UnnamedVariablesUnitTest.java
@@ -0,0 +1,93 @@
+package com.baeldung.unnamed.variables;
+
+import static com.baeldung.unnamed.variables.UnnamedVariables.countCarsOverLimitWithNamedVariable;
+import static com.baeldung.unnamed.variables.UnnamedVariables.countCarsOverLimitWithUnnamedVariable;
+import static com.baeldung.unnamed.variables.UnnamedVariables.getCarsByFirstLetterWithNamedVariables;
+import static com.baeldung.unnamed.variables.UnnamedVariables.getCarsByFirstLetterWithUnnamedVariables;
+import static com.baeldung.unnamed.variables.UnnamedVariables.handleCarExceptionWithNamedVariables;
+import static com.baeldung.unnamed.variables.UnnamedVariables.handleCarExceptionWithUnnamedVariables;
+import static com.baeldung.unnamed.variables.UnnamedVariables.obtainTransactionAndUpdateCarWithNamedVariables;
+import static com.baeldung.unnamed.variables.UnnamedVariables.obtainTransactionAndUpdateCarWithUnnamedVariables;
+import static com.baeldung.unnamed.variables.UnnamedVariables.removeThreeCarsAndReturnFirstRemovedWithNamedVariables;
+import static com.baeldung.unnamed.variables.UnnamedVariables.removeThreeCarsAndReturnFirstRemovedWithUnnamedVariables;
+import static com.baeldung.unnamed.variables.UnnamedVariables.sendNotificationToCarsWithNamedVariable;
+import static com.baeldung.unnamed.variables.UnnamedVariables.sendNotificationToCarsWithUnnamedVariable;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.LinkedList;
+
+import org.junit.jupiter.api.Test;
+
+public class UnnamedVariablesUnitTest extends CarScenario {
+
+ @Test
+ public void whenCountingCarsOverLimitWithNamedVariables_thenShouldReturnOne() {
+ assertEquals(1, countCarsOverLimitWithNamedVariable(cars, 2));
+ }
+
+ @Test
+ public void whenCountingCarsOverLimitWithUnnamedVariables_thenShouldReturnOne() {
+ assertEquals(1, countCarsOverLimitWithUnnamedVariable(cars, 2));
+ }
+
+ @Test
+ public void whenNotifyingCarsWithNamedVariables_thenShouldNotFail() {
+ assertDoesNotThrow(() -> sendNotificationToCarsWithNamedVariable(cars));
+ }
+
+ @Test
+ public void whenNotifyingCarsWithUnnamedVariables_thenShouldNotFail() {
+ assertDoesNotThrow(() -> sendNotificationToCarsWithUnnamedVariable(cars));
+ }
+
+ @Test
+ public void whenPollingCarsWithNamedVariables_thenReturnFirstOneAndEmptyQueue() {
+ var carQueue = new LinkedList<>(cars);
+ assertEquals("Mitsubishi", removeThreeCarsAndReturnFirstRemovedWithNamedVariables(carQueue).name());
+ assertEquals(0, carQueue.size());
+ }
+
+ @Test
+ public void whenPollingCarsWithUnnamedVariables_thenReturnFirstOneAndEmptyQueue() {
+ var carQueue = new LinkedList<>(cars);
+ assertEquals("Mitsubishi", removeThreeCarsAndReturnFirstRemovedWithUnnamedVariables(carQueue).name());
+ assertEquals(0, carQueue.size());
+ }
+
+ @Test
+ public void whenHandlingExceptionWithNamedVariables_thenNoExceptionIsThrown() {
+ assertDoesNotThrow(() -> handleCarExceptionWithNamedVariables(cars.get(0)));
+ }
+
+ @Test
+ public void whenHandlingExceptionWithUnnamedVariables_thenNoExceptionIsThrown() {
+ assertDoesNotThrow(() -> handleCarExceptionWithUnnamedVariables(cars.get(0)));
+ }
+
+ @Test
+ public void whenHandlingTransactionUpdateWithNamedVariables_thenNoExceptionIsThrown() {
+ assertDoesNotThrow(() -> obtainTransactionAndUpdateCarWithNamedVariables(cars.get(0)));
+ }
+
+ @Test
+ public void whenHandlingTransactionUpdateWithUnnamedVariables_thenNoExceptionIsThrown() {
+ assertDoesNotThrow(() -> obtainTransactionAndUpdateCarWithUnnamedVariables(cars.get(0)));
+ }
+
+ @Test
+ public void whenGettingCarsByFirstLetterWithNamedVariables_thenHaveThreeKeys() {
+ var carsByLetter = getCarsByFirstLetterWithNamedVariables(cars);
+ assertEquals(1, carsByLetter.get("M").size());
+ assertEquals(1, carsByLetter.get("T").size());
+ assertEquals(1, carsByLetter.get("J").size());
+ }
+
+ @Test
+ public void whenGettingCarsByFirstLetterWithUnnamedVariables_thenHaveThreeKeys() {
+ var carsByLetter = getCarsByFirstLetterWithUnnamedVariables(cars);
+ assertEquals(1, carsByLetter.get("M").size());
+ assertEquals(1, carsByLetter.get("T").size());
+ assertEquals(1, carsByLetter.get("J").size());
+ }
+}
diff --git a/core-java-modules/core-java-9-streams/README.md b/core-java-modules/core-java-9-streams/README.md
index 0ad8500689..d9663e0858 100644
--- a/core-java-modules/core-java-9-streams/README.md
+++ b/core-java-modules/core-java-9-streams/README.md
@@ -4,3 +4,4 @@ This module contains articles about Java 9 streams
### Relevant Articles:
- [How to Break from Java Stream forEach](https://www.baeldung.com/java-break-stream-foreach)
+- [Creating Stream of Regex Matches](https://www.baeldung.com/java-stream-regex-matches)
diff --git a/core-java-modules/core-java-arrays-guides/README.md b/core-java-modules/core-java-arrays-guides/README.md
index 0af77980af..d8b0d126a1 100644
--- a/core-java-modules/core-java-arrays-guides/README.md
+++ b/core-java-modules/core-java-arrays-guides/README.md
@@ -9,3 +9,4 @@ This module contains complete guides about arrays in Java
- [Guide to ArrayStoreException](https://www.baeldung.com/java-arraystoreexception)
- [Creating a Generic Array in Java](https://www.baeldung.com/java-generic-array)
- [Maximum Size of Java Arrays](https://www.baeldung.com/java-arrays-max-size)
+- [Merge Two Arrays and Remove Duplicates in Java](https://www.baeldung.com/java-merge-two-arrays-delete-duplicates)
diff --git a/core-java-modules/core-java-arrays-operations-advanced-2/README.md b/core-java-modules/core-java-arrays-operations-advanced-2/README.md
new file mode 100644
index 0000000000..17ffa2562d
--- /dev/null
+++ b/core-java-modules/core-java-arrays-operations-advanced-2/README.md
@@ -0,0 +1,2 @@
+## Relevant Articles
+- [Find the Middle Element of an Array in Java](https://www.baeldung.com/java-array-middle-item)
diff --git a/core-java-modules/core-java-arrays-operations-advanced/README.md b/core-java-modules/core-java-arrays-operations-advanced/README.md
index 0647d89d16..b379958f37 100644
--- a/core-java-modules/core-java-arrays-operations-advanced/README.md
+++ b/core-java-modules/core-java-arrays-operations-advanced/README.md
@@ -14,4 +14,3 @@ This module contains articles about advanced operations on arrays in Java. They
- [Slicing Arrays in Java](https://www.baeldung.com/java-slicing-arrays)
- [Combining Two or More Byte Arrays](https://www.baeldung.com/java-concatenate-byte-arrays)
- [Calculating the Sum of Two Arrays in Java](https://www.baeldung.com/java-sum-arrays-element-wise)
-- [Find the Middle Element of an Array in Java](https://www.baeldung.com/java-array-middle-item)
diff --git a/core-java-modules/core-java-char/src/test/java/com/baeldung/incrementchar/IncrementCharUnitTest.java b/core-java-modules/core-java-char/src/test/java/com/baeldung/incrementchar/IncrementCharUnitTest.java
new file mode 100644
index 0000000000..7621e85762
--- /dev/null
+++ b/core-java-modules/core-java-char/src/test/java/com/baeldung/incrementchar/IncrementCharUnitTest.java
@@ -0,0 +1,29 @@
+package com.baeldung.incrementchar;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+class IncrementCharUnitTest {
+ @Test
+ void whenUsingForLoop_thenGenerateCharacters(){
+ final List allCapitalCharacters = Arrays.asList('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
+ List characters = new ArrayList<>();
+ for (char character = 'A'; character <= 'Z'; character++) {
+ characters.add(character);
+ }
+ Assertions.assertEquals(characters, allCapitalCharacters);
+ }
+
+ @Test
+ void whenUsingStreams_thenGenerateCharacters() {
+ final List allCapitalCharacters = Arrays.asList('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
+ final List characters = IntStream.rangeClosed('A', 'Z').mapToObj(c -> (char) c).collect(Collectors.toList());
+ Assertions.assertEquals(characters, allCapitalCharacters);
+ }
+}
diff --git a/core-java-modules/core-java-collections-5/src/main/java/com/baeldung/skippingfirstelement/SkipFirstElementExample.java b/core-java-modules/core-java-collections-5/src/main/java/com/baeldung/skippingfirstelement/SkipFirstElementExample.java
new file mode 100644
index 0000000000..86982486fa
--- /dev/null
+++ b/core-java-modules/core-java-collections-5/src/main/java/com/baeldung/skippingfirstelement/SkipFirstElementExample.java
@@ -0,0 +1,126 @@
+package com.baeldung.skippingfirstelement;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+public class SkipFirstElementExample {
+
+ private final List stringList = new ArrayList<>();
+ private final Set stringSet = new HashSet<>();
+ private final Map stringMap = new HashMap<>();
+
+ public SkipFirstElementExample() {
+ // Initializing a List
+ stringList.add("Monday");
+ stringList.add("Tuesday");
+ stringList.add("Wednesday");
+ stringList.add("Thursday");
+ stringList.add("Friday");
+ stringList.add("Saturday");
+ stringList.add("Sunday");
+ // Initializing a Set
+ stringSet.add("Monday");
+ stringSet.add("Tuesday");
+ stringSet.add("Wednesday");
+ stringSet.add("Thursday");
+ stringSet.add("Friday");
+ stringSet.add("Saturday");
+ stringSet.add("Sunday");
+ // Initializing a Map
+ stringMap.put("Monday", "The day when coffee is a life support system.");
+ stringMap.put("Tuesday", "The day you realize that Monday's optimism was a lie.");
+ stringMap.put("Wednesday", "Hump Day, or as it's known, the 'Is it Friday yet?' day.");
+ stringMap.put("Thursday", "The day that says, 'Hold my beer, Friday is coming!'");
+ stringMap.put("Friday", "The golden child of the weekdays. The superhero of the workweek.");
+ stringMap.put("Saturday", "The day of rest? More like the day of 'What can I binge-watch next?'");
+ stringMap.put("Sunday", "The day before you have to adult again.");
+ }
+
+ void skippingFirstElementInListWithForLoop(List stringList) {
+ for (int i = 1; i < stringList.size(); i++) {
+ process(stringList.get(i));
+ }
+ }
+
+ void skippingFirstElementInListWithWhileLoop(List stringList) {
+ final Iterator iterator = stringList.iterator();
+ if (iterator.hasNext()) {
+ iterator.next();
+ }
+ while (iterator.hasNext()) {
+ process(iterator.next());
+ }
+ }
+
+ void skippingFirstElementInSetWithWhileLoop(Set stringSet) {
+ final Iterator iterator = stringSet.iterator();
+ if (iterator.hasNext()) {
+ iterator.next();
+ }
+ while (iterator.hasNext()) {
+ process(iterator.next());
+ }
+ }
+
+ void skippingFirstElementInListWithWhileLoopStoringFirstElement(List stringList) {
+ final Iterator iterator = stringList.iterator();
+ String firstElement = null;
+ if (iterator.hasNext()) {
+ firstElement = iterator.next();
+ }
+ while (iterator.hasNext()) {
+ process(iterator.next());
+ // additional logic using fistElement
+ }
+ }
+
+ void skippingFirstElementInMapWithStreamSkip(Map stringMap) {
+ stringMap.entrySet().stream().skip(1).forEach(this::process);
+ }
+
+ void skippingFirstElementInListWithSubList(List stringList) {
+ for (final String element : stringList.subList(1, stringList.size())) {
+ process(element);
+ }
+ }
+
+ void skippingFirstElementInListWithForLoopWithAdditionalCheck(List stringList) {
+ for (int i = 0; i < stringList.size(); i++) {
+ if (i == 0) {
+ // do something else
+ } else {
+ process(stringList.get(i));
+ }
+ }
+ }
+
+ void skippingFirstElementInListWithWhileLoopWithCounter(List stringList) {
+ int counter = 0;
+ while (counter < stringList.size()) {
+ if (counter != 0) {
+ process(stringList.get(counter));
+ }
+ ++counter;
+ }
+ }
+
+ void skippingFirstElementInListWithReduce(List stringList) {
+ stringList.stream().reduce((skip, element) -> {
+ process(element);
+ return element;
+ });
+ }
+
+ protected void process(String string) {
+ System.out.println(string);
+ }
+ protected void process(Entry mapEntry) {
+ System.out.println(mapEntry);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/skippingfirstelement/SkipFirstElementExampleUnitTest.java b/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/skippingfirstelement/SkipFirstElementExampleUnitTest.java
new file mode 100644
index 0000000000..9821b22ac7
--- /dev/null
+++ b/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/skippingfirstelement/SkipFirstElementExampleUnitTest.java
@@ -0,0 +1,122 @@
+package com.baeldung.skippingfirstelement;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Stream;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.condition.EnabledForJreRange;
+import org.junit.jupiter.api.condition.JRE;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
+@EnabledForJreRange(min = JRE.JAVA_9)
+class SkipFirstElementExampleUnitTest {
+
+ private static TestableSkipFirstElement testableSkip = new TestableSkipFirstElement();
+
+ @BeforeEach
+ void setup() {
+ testableSkip.reset();
+ }
+
+ private static Stream listProvider() {
+ return Stream.of(
+ Arguments.of(
+ List.of("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"),
+ List.of("Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"))
+ );
+ }
+
+ private static Stream mapProvider() {
+ return Stream.of(
+ Arguments.of(
+ Map.of(
+ "Monday", "The day when coffee is a life support system.",
+ "Tuesday", "The day you realize that Monday's optimism was a lie.",
+ "Wednesday", "Hump Day, or as it's known, the 'Is it Friday yet?' day.",
+ "Thursday", "The day that says, 'Hold my beer, Friday is coming!'",
+ "Friday", "The golden child of the weekdays. The superhero of the workweek.",
+ "Saturday", "The day of rest? More like the day of 'What can I binge-watch next?'",
+ "Sunday", "The day before you have to adult again."
+ )
+ )
+ );
+ }
+
+ @ParameterizedTest
+ @MethodSource("listProvider")
+ void skippingFirstElementInListWithForLoop(List input, List expected) {
+ testableSkip.skippingFirstElementInListWithForLoop(input);
+ List> actual = testableSkip.getResult();
+ assertEquals(actual, expected);
+ }
+
+ @ParameterizedTest
+ @MethodSource("listProvider")
+ void skippingFirstElementInListWithWhileLoop(List input, List expected) {
+ testableSkip.skippingFirstElementInListWithWhileLoop(input);
+ List> actual = testableSkip.getResult();
+ assertEquals(actual, expected);
+ }
+
+ @ParameterizedTest
+ @MethodSource("listProvider")
+ void skippingFirstElementInSetWithWhileLoop(List input) {
+ testableSkip.skippingFirstElementInSetWithWhileLoop(new HashSet<>(input));
+ Set> actual = new HashSet<>(testableSkip.getResult());
+ assertEquals(actual.size(), input.size() - 1);
+ }
+
+ @ParameterizedTest
+ @MethodSource("listProvider")
+ void skippingFirstElementInListWithWhileLoopStoringFirstElement(List input, List expected) {
+ testableSkip.skippingFirstElementInListWithWhileLoopStoringFirstElement(input);
+ List> actual = testableSkip.getResult();
+ assertEquals(actual, expected);
+ }
+
+ @ParameterizedTest
+ @MethodSource("mapProvider")
+ void skippingFirstElementInMapWithStreamSkip(Map input) {
+ testableSkip.skippingFirstElementInMapWithStreamSkip(input);
+ List> actual = testableSkip.getResult();
+ assertEquals(actual.size(), input.size() - 1);
+ }
+
+ @ParameterizedTest
+ @MethodSource("listProvider")
+ void skippingFirstElementInListWithSubList(List input, List expected) {
+ testableSkip.skippingFirstElementInListWithSubList(input);
+ List> actual = testableSkip.getResult();
+ assertEquals(actual, expected);
+ }
+
+ @ParameterizedTest
+ @MethodSource("listProvider")
+ void skippingFirstElementInListWithForLoopWithAdditionalCheck(List input, List expected) {
+ testableSkip.skippingFirstElementInListWithForLoopWithAdditionalCheck(input);
+ List> actual = testableSkip.getResult();
+ assertEquals(actual, expected);
+ }
+
+ @ParameterizedTest
+ @MethodSource("listProvider")
+ void skippingFirstElementInListWithWhileLoopWithCounter(List input, List expected) {
+ testableSkip.skippingFirstElementInListWithWhileLoopWithCounter(input);
+ List> actual = testableSkip.getResult();
+ assertEquals(actual, expected);
+ }
+
+ @ParameterizedTest
+ @MethodSource("listProvider")
+ void skippingFirstElementInListWithReduce(List input, List expected) {
+ testableSkip.skippingFirstElementInListWithReduce(input);
+ List> actual = testableSkip.getResult();
+ assertEquals(actual, expected);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/skippingfirstelement/TestableSkip.java b/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/skippingfirstelement/TestableSkip.java
new file mode 100644
index 0000000000..0e2f340485
--- /dev/null
+++ b/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/skippingfirstelement/TestableSkip.java
@@ -0,0 +1,10 @@
+package com.baeldung.skippingfirstelement;
+
+import java.util.List;
+
+public interface TestableSkip {
+
+ void reset();
+
+ List> getResult();
+}
diff --git a/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/skippingfirstelement/TestableSkipFirstElement.java b/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/skippingfirstelement/TestableSkipFirstElement.java
new file mode 100644
index 0000000000..99facb73ad
--- /dev/null
+++ b/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/skippingfirstelement/TestableSkipFirstElement.java
@@ -0,0 +1,37 @@
+package com.baeldung.skippingfirstelement;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map.Entry;
+
+public class TestableSkipFirstElement extends SkipFirstElementExample implements TestableSkip {
+
+
+ private List processedList = new ArrayList<>();
+ private List> processedEntryList = new ArrayList<>();
+
+ @Override
+ public void process(String string) {
+ processedList.add(string);
+ }
+
+ @Override
+ public void process(Entry stringEntry) {
+ processedEntryList.add(stringEntry);
+ }
+
+ @Override
+ public void reset() {
+ processedList.clear();
+ processedEntryList.clear();
+ }
+
+ @Override
+ public List> getResult() {
+ if (!processedList.isEmpty())
+ return processedList;
+ return processedEntryList;
+ }
+
+
+}
diff --git a/core-java-modules/core-java-collections-array-list-2/README.md b/core-java-modules/core-java-collections-array-list-2/README.md
new file mode 100644
index 0000000000..dbf5c47edb
--- /dev/null
+++ b/core-java-modules/core-java-collections-array-list-2/README.md
@@ -0,0 +1,6 @@
+## Core Java Collections ArrayList
+
+This module contains articles about the Java ArrayList collection
+
+### Relevant Articles:
+- [Create an ArrayList with Multiple Object Types](https://www.baeldung.com/arraylist-with-multiple-object-types)
diff --git a/core-java-modules/core-java-collections-array-list-2/pom.xml b/core-java-modules/core-java-collections-array-list-2/pom.xml
new file mode 100644
index 0000000000..042f6e5bb5
--- /dev/null
+++ b/core-java-modules/core-java-collections-array-list-2/pom.xml
@@ -0,0 +1,32 @@
+
+ 4.0.0
+ core-java-collections-array-list-2
+ core-java-collections-array-list-2
+ jar
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 0.0.1-SNAPSHOT
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ ${maven-compiler-plugin.source}
+ ${maven-compiler-plugin.target}
+
+
+
+
+
+
+ 17
+ 17
+
+
diff --git a/core-java-modules/core-java-collections-array-list-2/src/main/java/com/baeldung/list/multipleobjecttypes/AlternativeMultipeTypeList.java b/core-java-modules/core-java-collections-array-list-2/src/main/java/com/baeldung/list/multipleobjecttypes/AlternativeMultipeTypeList.java
new file mode 100644
index 0000000000..5315147dff
--- /dev/null
+++ b/core-java-modules/core-java-collections-array-list-2/src/main/java/com/baeldung/list/multipleobjecttypes/AlternativeMultipeTypeList.java
@@ -0,0 +1,51 @@
+package com.baeldung.list.multipleobjecttypes;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.function.Predicate;
+
+public class AlternativeMultipeTypeList {
+
+ public static void main(String[] args) {
+ // List of Parent Class
+ ArrayList myList = new ArrayList<>();
+ myList.add(1.2);
+ myList.add(2);
+ myList.add(-3.5);
+
+ // List of Interface type
+ ArrayList