diff --git a/libraries-5/pom.xml b/libraries-5/pom.xml
index 06b1b32ad51b..fde731809405 100644
--- a/libraries-5/pom.xml
+++ b/libraries-5/pom.xml
@@ -219,6 +219,11 @@
restfb
${com.restfb.version}
+
+ io.github.java-diff-utils
+ java-diff-utils
+ ${java-diff-utils.version}
+
@@ -238,6 +243,7 @@
1.327
2025.6.0
3.4
+ 4.12
diff --git a/libraries-5/src/main/java/com/baeldung/javadiffutils/PatchUtil.java b/libraries-5/src/main/java/com/baeldung/javadiffutils/PatchUtil.java
new file mode 100644
index 000000000000..e681d91662bb
--- /dev/null
+++ b/libraries-5/src/main/java/com/baeldung/javadiffutils/PatchUtil.java
@@ -0,0 +1,13 @@
+package com.baeldung.javadiffutils;
+
+import com.github.difflib.DiffUtils;
+import com.github.difflib.patch.PatchFailedException;
+
+import java.util.List;
+
+public class PatchUtil {
+ public static List apply(List original, List revised) throws PatchFailedException {
+ var patch = DiffUtils.diff(original, revised);
+ return DiffUtils.patch(original, patch);
+ }
+}
diff --git a/libraries-5/src/main/java/com/baeldung/javadiffutils/SideBySideViewUtil.java b/libraries-5/src/main/java/com/baeldung/javadiffutils/SideBySideViewUtil.java
new file mode 100644
index 000000000000..86526ff20393
--- /dev/null
+++ b/libraries-5/src/main/java/com/baeldung/javadiffutils/SideBySideViewUtil.java
@@ -0,0 +1,21 @@
+package com.baeldung.javadiffutils;
+
+import com.github.difflib.DiffUtils;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class SideBySideViewUtil {
+
+ private static final Logger logger = Logger.getLogger(SideBySideViewUtil.class.getName());
+
+ public static void display(List original, List revised)
+ {
+ var patch = DiffUtils.diff(original, revised);
+ patch.getDeltas().forEach(delta -> {
+ logger.log(Level.INFO,"Change: " + delta.getType());
+ logger.log(Level.INFO,"Original: " + delta.getSource().getLines());
+ logger.log(Level.INFO,"Revised: " + delta.getTarget().getLines());
+ });
+ }
+}
diff --git a/libraries-5/src/main/java/com/baeldung/javadiffutils/TextComparatorUtil.java b/libraries-5/src/main/java/com/baeldung/javadiffutils/TextComparatorUtil.java
new file mode 100644
index 000000000000..427b01aa3d37
--- /dev/null
+++ b/libraries-5/src/main/java/com/baeldung/javadiffutils/TextComparatorUtil.java
@@ -0,0 +1,11 @@
+package com.baeldung.javadiffutils;
+
+import com.github.difflib.DiffUtils;
+import com.github.difflib.patch.Patch;
+import java.util.List;
+
+public class TextComparatorUtil {
+ public static Patch compare(List original, List revised) {
+ return DiffUtils.diff(original, revised);
+ }
+}
diff --git a/libraries-5/src/main/java/com/baeldung/javadiffutils/UnifiedDiffGeneratorUtil.java b/libraries-5/src/main/java/com/baeldung/javadiffutils/UnifiedDiffGeneratorUtil.java
new file mode 100644
index 000000000000..2d0d9a6432bd
--- /dev/null
+++ b/libraries-5/src/main/java/com/baeldung/javadiffutils/UnifiedDiffGeneratorUtil.java
@@ -0,0 +1,13 @@
+package com.baeldung.javadiffutils;
+
+import com.github.difflib.DiffUtils;
+import com.github.difflib.UnifiedDiffUtils;
+
+import java.util.List;
+
+public class UnifiedDiffGeneratorUtil {
+ public static List generate(List original, List revised, String fileName) {
+ var patch = DiffUtils.diff(original, revised);
+ return UnifiedDiffUtils.generateUnifiedDiff(fileName, fileName + ".new", original, patch, 3);
+ }
+}
diff --git a/libraries-5/src/test/java/com/baeldung/javadiffutils/PatchUtilTest.java b/libraries-5/src/test/java/com/baeldung/javadiffutils/PatchUtilTest.java
new file mode 100644
index 000000000000..d87240698c19
--- /dev/null
+++ b/libraries-5/src/test/java/com/baeldung/javadiffutils/PatchUtilTest.java
@@ -0,0 +1,18 @@
+package com.baeldung.javadiffutils;
+
+import com.github.difflib.patch.PatchFailedException;
+import org.junit.Test;
+import java.util.List;
+import static org.junit.Assert.assertEquals;
+
+public class PatchUtilTest {
+ @Test
+ public void givenPatch_whenApplied_thenMatchesRevised() throws PatchFailedException {
+ var original = List.of("alpha", "beta", "gamma");
+ var revised = List.of("alpha", "beta-updated", "gamma");
+
+ var result = PatchUtil.apply(original, revised);
+
+ assertEquals(revised, result);
+ }
+}
diff --git a/libraries-5/src/test/java/com/baeldung/javadiffutils/SideBySideViewUtilTest.java b/libraries-5/src/test/java/com/baeldung/javadiffutils/SideBySideViewUtilTest.java
new file mode 100644
index 000000000000..6508a18f6466
--- /dev/null
+++ b/libraries-5/src/test/java/com/baeldung/javadiffutils/SideBySideViewUtilTest.java
@@ -0,0 +1,17 @@
+package com.baeldung.javadiffutils;
+
+import org.junit.Test;
+
+import java.util.List;
+
+public class SideBySideViewUtilTest {
+
+ @Test
+ public void givenDifferentLists_whenDisplayCalled_thenNoExceptionThrown() {
+ List original = List.of("line1", "line2", "line3");
+ List revised = List.of("line1", "line2-modified", "line3", "line4");
+
+ SideBySideViewUtil.display(original, revised);
+ }
+
+}
diff --git a/libraries-5/src/test/java/com/baeldung/javadiffutils/TextComparatorUtilTest.java b/libraries-5/src/test/java/com/baeldung/javadiffutils/TextComparatorUtilTest.java
new file mode 100644
index 000000000000..ee7112f8b3c6
--- /dev/null
+++ b/libraries-5/src/test/java/com/baeldung/javadiffutils/TextComparatorUtilTest.java
@@ -0,0 +1,21 @@
+package com.baeldung.javadiffutils;
+
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class TextComparatorUtilTest {
+ @Test
+ public void givenDifferentLines_whenCompared_thenDetectsChanges() {
+ var original = List.of("A", "B", "C");
+ var revised = List.of("A", "B", "D");
+
+ var patch = TextComparatorUtil.compare(original, revised);
+
+ assertEquals(1, patch.getDeltas().size());
+ assertEquals("C", patch.getDeltas().get(0).getSource().getLines().get(0));
+ assertEquals("D", patch.getDeltas().get(0).getTarget().getLines().get(0));
+ }
+}
diff --git a/libraries-5/src/test/java/com/baeldung/javadiffutils/UnifiedDiffGeneratorUtilTest.java b/libraries-5/src/test/java/com/baeldung/javadiffutils/UnifiedDiffGeneratorUtilTest.java
new file mode 100644
index 000000000000..db5db7f2e10e
--- /dev/null
+++ b/libraries-5/src/test/java/com/baeldung/javadiffutils/UnifiedDiffGeneratorUtilTest.java
@@ -0,0 +1,20 @@
+package com.baeldung.javadiffutils;
+
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.junit.Assert.assertTrue;
+
+public class UnifiedDiffGeneratorUtilTest {
+ @Test
+ public void givenModifiedText_whenUnifiedDiffGenerated_thenContainsExpectedChanges() {
+ var original = List.of("x", "y", "z");
+ var revised = List.of("x", "y-modified", "z");
+
+ var diff = UnifiedDiffGeneratorUtil.generate(original, revised, "test.txt");
+
+ assertTrue(diff.stream().anyMatch(line -> line.contains("-y")));
+ assertTrue(diff.stream().anyMatch(line -> line.contains("+y-modified")));
+ }
+}