diff --git a/core-java-modules/core-java-streams-5/pom.xml b/core-java-modules/core-java-streams-5/pom.xml
index e217271f4c..33cd69f761 100644
--- a/core-java-modules/core-java-streams-5/pom.xml
+++ b/core-java-modules/core-java-streams-5/pom.xml
@@ -48,6 +48,11 @@
guava
${guava.version}
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
diff --git a/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/firstmatchingelement/User.java b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/firstmatchingelement/User.java
new file mode 100644
index 0000000000..cb29af529a
--- /dev/null
+++ b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/firstmatchingelement/User.java
@@ -0,0 +1,21 @@
+package com.baeldung.streams.firstmatchingelement;
+
+public class User {
+
+ private String userName;
+ private Integer userId;
+
+ public User(Integer userId, String userName) {
+ this.userId = userId;
+ this.userName = userName;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public Integer getUserId() {
+ return userId;
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java
new file mode 100644
index 0000000000..db9415e94b
--- /dev/null
+++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java
@@ -0,0 +1,72 @@
+package com.baeldung.streams.firstmatchingelement;
+
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.IntStream;
+
+import org.apache.commons.collections4.IterableUtils;
+import org.junit.Test;
+
+import com.google.common.collect.Iterables;
+
+public class FirstMatchingElementUnitTest {
+
+ private List userList = List.of(new User(1, "David"), new User(2, "John"), new User(3, "Roger"), new User(4, "John"));
+ private String searchName = "John";
+
+ @Test
+ public void whenUsingStream_thenFindFirstMatchingUserIndex() {
+ AtomicInteger counter = new AtomicInteger(-1);
+ int index = userList.stream()
+ .filter(user -> {
+ counter.getAndIncrement();
+ return searchName.equals(user.getUserName());
+ })
+ .mapToInt(user -> counter.get())
+ .findFirst()
+ .orElse(-1);
+
+ assertEquals(1, index);
+ }
+
+ @Test
+ public void whenUsingIntStream_thenFindFirstMatchingUserIndex() {
+ int index = IntStream.range(0, userList.size() - 1)
+ .filter(streamIndex -> searchName.equals(userList.get(streamIndex).getUserName()))
+ .findFirst()
+ .orElse(-1);
+ assertEquals(1, index);
+ }
+
+ @Test
+ public void whenUsingTakeWhile_thenFindFirstMatchingUserIndex() {
+ long predicateIndex = userList.stream()
+ .takeWhile(user -> !user.getUserName().equals(searchName))
+ .count();
+ assertEquals(1, predicateIndex);
+ }
+
+ @Test
+ public void whenUsingTakeWhile_thenFindIndexFromNoMatchingElement() {
+ List userList = List.of(new User(1, "David"), new User(2, "Vick"), new User(3, "Roger"), new User(4, "James"));
+ long predicateIndex = userList.stream()
+ .takeWhile(user -> !user.getUserName().equals(searchName))
+ .count();
+ assertEquals(4, predicateIndex);
+ }
+
+ @Test
+ public void whenUsingGoogleGuava_thenFindFirstMatchingUserIndex() {
+ int index = Iterables.indexOf(userList, user -> searchName.equals(user.getUserName()));
+ assertEquals(1, index);
+ }
+
+ @Test
+ public void whenUsingApacheCommons_thenFindFirstMatchingUserIndex() {
+ int index = IterableUtils.indexOf(userList, user -> searchName.equals(user.getUserName()));
+ assertEquals(1, index);
+ }
+}