From fe6bb0e286fe060c6337bf1623e77bd7d179b283 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Thu, 5 Oct 2023 11:44:52 +0530 Subject: [PATCH 01/18] Primary Commit --- core-java-modules/core-java-streams-5/pom.xml | 6 + .../FirstMatchingElementUnitTest.java | 104 ++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java diff --git a/core-java-modules/core-java-streams-5/pom.xml b/core-java-modules/core-java-streams-5/pom.xml index dc97d81b3d..042186c9bf 100644 --- a/core-java-modules/core-java-streams-5/pom.xml +++ b/core-java-modules/core-java-streams-5/pom.xml @@ -43,6 +43,12 @@ vavr ${vavr.version} + + com.codepoetics + protonpack + 1.16 + + 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..3e9cbcdc0b --- /dev/null +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java @@ -0,0 +1,104 @@ +package com.baeldung.streams.firstmatchingelement; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.Optional; +import java.util.OptionalInt; +import java.util.stream.IntStream; + +import org.assertj.core.util.Lists; +import org.junit.Test; + +import com.codepoetics.protonpack.StreamUtils; + +public class FirstMatchingElementUnitTest { + + @Test + public void testWithForLoop() { + List dataList = Lists.newArrayList("String", 1, Boolean.TRUE); + int index = -1; + for (int i = 0; i < dataList.size(); i++) { + if (dataList.get(i) instanceof Boolean) { + index = i; + } + } + assertEquals(2, index); + } + + @Test + public void testWithIndexOf() { + List dataList = Lists.newArrayList("String", 1, Boolean.TRUE); + Optional booleanData = dataList.stream() + .filter(data -> data instanceof Boolean) + .findFirst(); + int index = booleanData.isPresent() ? dataList.indexOf(booleanData.get()) : -1; + assertEquals(2, index); + } + + @Test + public void testWithIterator() { + List dataList = Lists.newArrayList("String", 1, Boolean.TRUE); + int index = -1; + Iterator iterator = dataList.iterator(); + while (iterator.hasNext()) { + Object data = iterator.next(); + if (data instanceof Boolean) { + index = dataList.indexOf(data); + break; + } + } + assertEquals(2, index); + } + + @Test + public void testWithListIterator() { + List dataList = Lists.newArrayList("String", 1, Boolean.TRUE); + int index = -1; + ListIterator listIterator = dataList.listIterator(); + while (listIterator.hasNext()) { + if (listIterator.next() instanceof Boolean) { + index = listIterator.previousIndex(); + break; + } + } + assertEquals(2, index); + } + + @Test + public void testWithTakeAWhile() { + List dataList = Lists.newArrayList("String", 1, Boolean.TRUE, 2, 3); + OptionalInt booleanIndex = dataList.stream() + .takeWhile(data -> !(data instanceof Boolean)) + .mapToInt(dataList::indexOf) + .max(); + + if (booleanIndex.isPresent() && dataList.get(booleanIndex.getAsInt()) instanceof Boolean) { + assertEquals(2, booleanIndex.getAsInt()); + } + } + + @Test + public void testWithIntStream() { + List dataList = Lists.newArrayList("String", 1, Boolean.TRUE); + int index = IntStream.of(0, dataList.size() - 1) + .filter(streamIndex -> dataList.get(streamIndex) instanceof Boolean) + .findFirst() + .orElse(-1); + assertEquals(2, index); + } + + @Test + public void testWithZipWithIndex() { + List dataList = Lists.newArrayList("String", 1, Boolean.TRUE, 2, 3); + int index = StreamUtils.zipWithIndex(dataList.stream()) + .filter(i -> i.getValue() instanceof Boolean) + .mapToInt(i -> Long.valueOf(i.getIndex()) + .intValue()) + .findFirst() + .orElse(-1); + assertEquals(2, index); + } +} From 31b23630ecf500e83a1c9c3039078d113e15ef17 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Fri, 6 Oct 2023 18:53:27 +0530 Subject: [PATCH 02/18] More Cases covered --- core-java-modules/core-java-streams-5/pom.xml | 11 +- .../FirstMatchingElementUnitTest.java | 101 +++++++++++------- 2 files changed, 71 insertions(+), 41 deletions(-) diff --git a/core-java-modules/core-java-streams-5/pom.xml b/core-java-modules/core-java-streams-5/pom.xml index 042186c9bf..6092b1278e 100644 --- a/core-java-modules/core-java-streams-5/pom.xml +++ b/core-java-modules/core-java-streams-5/pom.xml @@ -48,7 +48,16 @@ protonpack 1.16 - + + org.apache.commons + commons-collections4 + 4.4 + + + one.util + streamex + 0.8.1 + 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 index 3e9cbcdc0b..34e6e62cef 100644 --- 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 @@ -5,42 +5,35 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.Iterator; import java.util.List; import java.util.ListIterator; -import java.util.Optional; import java.util.OptionalInt; import java.util.stream.IntStream; +import org.apache.commons.collections4.IterableUtils; import org.assertj.core.util.Lists; import org.junit.Test; import com.codepoetics.protonpack.StreamUtils; +import com.google.common.collect.Iterables; + +import io.vavr.collection.Stream; +import one.util.streamex.EntryStream; public class FirstMatchingElementUnitTest { - @Test - public void testWithForLoop() { - List dataList = Lists.newArrayList("String", 1, Boolean.TRUE); - int index = -1; - for (int i = 0; i < dataList.size(); i++) { - if (dataList.get(i) instanceof Boolean) { - index = i; - } - } - assertEquals(2, index); - } + private final List dataList = Lists.newArrayList("String", Boolean.TRUE, Integer.valueOf(10), Boolean.FALSE, Double.valueOf(20.0)); @Test - public void testWithIndexOf() { - List dataList = Lists.newArrayList("String", 1, Boolean.TRUE); - Optional booleanData = dataList.stream() + public void whenCalled_thenFindIndexUsingStream() { + int index = dataList.stream() .filter(data -> data instanceof Boolean) - .findFirst(); - int index = booleanData.isPresent() ? dataList.indexOf(booleanData.get()) : -1; - assertEquals(2, index); + .mapToInt(data -> dataList.indexOf(data)) + .findFirst() + .orElse(-1); + assertEquals(1, index); } @Test - public void testWithIterator() { - List dataList = Lists.newArrayList("String", 1, Boolean.TRUE); + public void whenCalled_thenFindIndexUsingStreamIterator() { int index = -1; Iterator iterator = dataList.iterator(); while (iterator.hasNext()) { @@ -50,12 +43,11 @@ public class FirstMatchingElementUnitTest { break; } } - assertEquals(2, index); + assertEquals(1, index); } @Test - public void testWithListIterator() { - List dataList = Lists.newArrayList("String", 1, Boolean.TRUE); + public void whenCalled_thenFindIndexUsingStreamListIterator() { int index = -1; ListIterator listIterator = dataList.listIterator(); while (listIterator.hasNext()) { @@ -64,41 +56,70 @@ public class FirstMatchingElementUnitTest { break; } } - assertEquals(2, index); + assertEquals(1, index); } @Test - public void testWithTakeAWhile() { - List dataList = Lists.newArrayList("String", 1, Boolean.TRUE, 2, 3); + public void whenCalled_thenFindIndexUsingIntStream() { + int index = IntStream.range(0, dataList.size() - 1) + .filter(streamIndex -> dataList.get(streamIndex) instanceof Boolean) + .findFirst() + .orElse(-1); + assertEquals(1, index); + } + + @Test + public void whenCalled_thenFindIndexUsingStreamTakeWhile() { OptionalInt booleanIndex = dataList.stream() .takeWhile(data -> !(data instanceof Boolean)) .mapToInt(dataList::indexOf) .max(); if (booleanIndex.isPresent() && dataList.get(booleanIndex.getAsInt()) instanceof Boolean) { - assertEquals(2, booleanIndex.getAsInt()); + assertEquals(1, booleanIndex.getAsInt()); } } @Test - public void testWithIntStream() { - List dataList = Lists.newArrayList("String", 1, Boolean.TRUE); - int index = IntStream.of(0, dataList.size() - 1) - .filter(streamIndex -> dataList.get(streamIndex) instanceof Boolean) - .findFirst() - .orElse(-1); - assertEquals(2, index); - } - - @Test - public void testWithZipWithIndex() { - List dataList = Lists.newArrayList("String", 1, Boolean.TRUE, 2, 3); + public void whenCalled_thenFindIndexUsingZipWithIndex() { int index = StreamUtils.zipWithIndex(dataList.stream()) .filter(i -> i.getValue() instanceof Boolean) .mapToInt(i -> Long.valueOf(i.getIndex()) .intValue()) .findFirst() .orElse(-1); - assertEquals(2, index); + assertEquals(1, index); + } + + @Test + public void whenCalled_thenFindIndexUsingGoogleGuava() { + int index = Iterables.indexOf(dataList, data -> data instanceof Boolean); + assertEquals(1, index); + } + + @Test + public void whenCalled_thenFindIndexUsingApacheCommons() { + int index = IterableUtils.indexOf(dataList, data -> data instanceof Boolean); + assertEquals(1, index); + } + + @Test + public void whenCalled_thenFindIndexUsingStreamEx() { + Integer foundIndex = EntryStream.of(dataList) + .filterKeyValue((index, data) -> data instanceof Boolean) + .keys() + .findFirst() + .orElse(-1); + assertEquals(1, foundIndex); + } + + @Test + public void whenCalled_thenFindIndexUsingVavrStream() { + Integer foundIndex = Stream.of(dataList.toArray()) + .zipWithIndex() + .find(tuple -> tuple._1() instanceof Boolean) + .map(tuple -> tuple._2()) + .getOrElse(-1); + assertEquals(1, foundIndex); } } From 10da2b32ba321fbaff34a2a93c385b6684a39f92 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Fri, 6 Oct 2023 19:11:54 +0530 Subject: [PATCH 03/18] Indentation Corrections on POM --- core-java-modules/core-java-streams-5/pom.xml | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/core-java-modules/core-java-streams-5/pom.xml b/core-java-modules/core-java-streams-5/pom.xml index 6092b1278e..d7b05f6bac 100644 --- a/core-java-modules/core-java-streams-5/pom.xml +++ b/core-java-modules/core-java-streams-5/pom.xml @@ -43,21 +43,21 @@ vavr ${vavr.version} - - com.codepoetics - protonpack - 1.16 - - - org.apache.commons - commons-collections4 - 4.4 - - - one.util - streamex - 0.8.1 - + + com.codepoetics + protonpack + 1.16 + + + org.apache.commons + commons-collections4 + 4.4 + + + one.util + streamex + 0.8.1 + From 51603e4af61517d5668bffbd6f8254945c76e715 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Sat, 7 Oct 2023 23:28:10 +0530 Subject: [PATCH 04/18] Merge Conflict Fixed --- core-java-modules/core-java-streams-5/pom.xml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/core-java-modules/core-java-streams-5/pom.xml b/core-java-modules/core-java-streams-5/pom.xml index d7baf84d30..adffb4cf19 100644 --- a/core-java-modules/core-java-streams-5/pom.xml +++ b/core-java-modules/core-java-streams-5/pom.xml @@ -48,6 +48,21 @@ guava ${guava.version} + + com.codepoetics + protonpack + 1.16 + + + org.apache.commons + commons-collections4 + 4.4 + + + one.util + streamex + 0.8.1 + From ca432bbe6b036d2a4c18914e2e44b8803d27631f Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Sun, 8 Oct 2023 21:57:29 +0530 Subject: [PATCH 05/18] Updating as per Jira comments --- core-java-modules/core-java-streams-5/pom.xml | 10 ---- .../FirstMatchingElementUnitTest.java | 51 ++++--------------- 2 files changed, 10 insertions(+), 51 deletions(-) diff --git a/core-java-modules/core-java-streams-5/pom.xml b/core-java-modules/core-java-streams-5/pom.xml index adffb4cf19..bdfa4cb76d 100644 --- a/core-java-modules/core-java-streams-5/pom.xml +++ b/core-java-modules/core-java-streams-5/pom.xml @@ -48,21 +48,11 @@ guava ${guava.version} - - com.codepoetics - protonpack - 1.16 - org.apache.commons commons-collections4 4.4 - - one.util - streamex - 0.8.1 - 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 index 34e6e62cef..a7bcef55ec 100644 --- 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 @@ -5,19 +5,14 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.Iterator; import java.util.List; import java.util.ListIterator; -import java.util.OptionalInt; import java.util.stream.IntStream; import org.apache.commons.collections4.IterableUtils; import org.assertj.core.util.Lists; import org.junit.Test; -import com.codepoetics.protonpack.StreamUtils; import com.google.common.collect.Iterables; -import io.vavr.collection.Stream; -import one.util.streamex.EntryStream; - public class FirstMatchingElementUnitTest { private final List dataList = Lists.newArrayList("String", Boolean.TRUE, Integer.valueOf(10), Boolean.FALSE, Double.valueOf(20.0)); @@ -70,25 +65,18 @@ public class FirstMatchingElementUnitTest { @Test public void whenCalled_thenFindIndexUsingStreamTakeWhile() { - OptionalInt booleanIndex = dataList.stream() + int lastIndex = dataList.size() - 1; + int predicateIndex = dataList.stream() .takeWhile(data -> !(data instanceof Boolean)) .mapToInt(dataList::indexOf) - .max(); - - if (booleanIndex.isPresent() && dataList.get(booleanIndex.getAsInt()) instanceof Boolean) { - assertEquals(1, booleanIndex.getAsInt()); - } - } - - @Test - public void whenCalled_thenFindIndexUsingZipWithIndex() { - int index = StreamUtils.zipWithIndex(dataList.stream()) - .filter(i -> i.getValue() instanceof Boolean) - .mapToInt(i -> Long.valueOf(i.getIndex()) - .intValue()) - .findFirst() + .max() .orElse(-1); - assertEquals(1, index); + + if (predicateIndex != 1 && predicateIndex != lastIndex) { + assertEquals(1, predicateIndex + 1); + } else { + assertEquals(lastIndex, predicateIndex); + } } @Test @@ -99,27 +87,8 @@ public class FirstMatchingElementUnitTest { @Test public void whenCalled_thenFindIndexUsingApacheCommons() { + List dataList = Lists.newArrayList("String", Boolean.TRUE, Integer.valueOf(10), Boolean.FALSE, Double.valueOf(20.0)); int index = IterableUtils.indexOf(dataList, data -> data instanceof Boolean); assertEquals(1, index); } - - @Test - public void whenCalled_thenFindIndexUsingStreamEx() { - Integer foundIndex = EntryStream.of(dataList) - .filterKeyValue((index, data) -> data instanceof Boolean) - .keys() - .findFirst() - .orElse(-1); - assertEquals(1, foundIndex); - } - - @Test - public void whenCalled_thenFindIndexUsingVavrStream() { - Integer foundIndex = Stream.of(dataList.toArray()) - .zipWithIndex() - .find(tuple -> tuple._1() instanceof Boolean) - .map(tuple -> tuple._2()) - .getOrElse(-1); - assertEquals(1, foundIndex); - } } From 1002f9b196159f564949424a74ebb99e69484729 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Sun, 8 Oct 2023 21:59:20 +0530 Subject: [PATCH 06/18] Correction --- .../firstmatchingelement/FirstMatchingElementUnitTest.java | 1 - 1 file changed, 1 deletion(-) 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 index a7bcef55ec..fb834cd23c 100644 --- 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 @@ -87,7 +87,6 @@ public class FirstMatchingElementUnitTest { @Test public void whenCalled_thenFindIndexUsingApacheCommons() { - List dataList = Lists.newArrayList("String", Boolean.TRUE, Integer.valueOf(10), Boolean.FALSE, Double.valueOf(20.0)); int index = IterableUtils.indexOf(dataList, data -> data instanceof Boolean); assertEquals(1, index); } From 9c152ce3bdc4261589266d7a386c830dd3eb3b7a Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Mon, 9 Oct 2023 20:10:12 +0530 Subject: [PATCH 07/18] Review Comment Implementation --- core-java-modules/core-java-streams-5/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-streams-5/pom.xml b/core-java-modules/core-java-streams-5/pom.xml index bdfa4cb76d..77c477cf40 100644 --- a/core-java-modules/core-java-streams-5/pom.xml +++ b/core-java-modules/core-java-streams-5/pom.xml @@ -51,7 +51,7 @@ org.apache.commons commons-collections4 - 4.4 + ${commons-collections4.version} From a78b189d695869991ba8d378090488b1d9733264 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Mon, 9 Oct 2023 23:27:14 +0530 Subject: [PATCH 08/18] Indentation fixes --- .../FirstMatchingElementUnitTest.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) 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 index fb834cd23c..43feea0074 100644 --- 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 @@ -20,10 +20,10 @@ public class FirstMatchingElementUnitTest { @Test public void whenCalled_thenFindIndexUsingStream() { int index = dataList.stream() - .filter(data -> data instanceof Boolean) - .mapToInt(data -> dataList.indexOf(data)) - .findFirst() - .orElse(-1); + .filter(data -> data instanceof Boolean) + .mapToInt(data -> dataList.indexOf(data)) + .findFirst() + .orElse(-1); assertEquals(1, index); } @@ -57,9 +57,9 @@ public class FirstMatchingElementUnitTest { @Test public void whenCalled_thenFindIndexUsingIntStream() { int index = IntStream.range(0, dataList.size() - 1) - .filter(streamIndex -> dataList.get(streamIndex) instanceof Boolean) - .findFirst() - .orElse(-1); + .filter(streamIndex -> dataList.get(streamIndex) instanceof Boolean) + .findFirst() + .orElse(-1); assertEquals(1, index); } @@ -67,10 +67,10 @@ public class FirstMatchingElementUnitTest { public void whenCalled_thenFindIndexUsingStreamTakeWhile() { int lastIndex = dataList.size() - 1; int predicateIndex = dataList.stream() - .takeWhile(data -> !(data instanceof Boolean)) - .mapToInt(dataList::indexOf) - .max() - .orElse(-1); + .takeWhile(data -> !(data instanceof Boolean)) + .mapToInt(dataList::indexOf) + .max() + .orElse(-1); if (predicateIndex != 1 && predicateIndex != lastIndex) { assertEquals(1, predicateIndex + 1); From 3caca638defb364835f0b9ae6a99e4805c4c99f0 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Thu, 12 Oct 2023 02:58:49 +0530 Subject: [PATCH 09/18] Review Comment Implementation --- .../streams/firstmatchingelement/User.java | 21 ++++++++ .../FirstMatchingElementUnitTest.java | 52 ++++++++++--------- 2 files changed, 48 insertions(+), 25 deletions(-) create mode 100644 core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/firstmatchingelement/User.java 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 index 43feea0074..d1ca588047 100644 --- 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 @@ -15,26 +15,27 @@ import com.google.common.collect.Iterables; public class FirstMatchingElementUnitTest { - private final List dataList = Lists.newArrayList("String", Boolean.TRUE, Integer.valueOf(10), Boolean.FALSE, Double.valueOf(20.0)); + private List userList = Lists.newArrayList(new User(1, "David"), new User(2, "John"), new User(3, "Roger"), new User(4, "John")); + private String searchName = "John"; @Test - public void whenCalled_thenFindIndexUsingStream() { - int index = dataList.stream() - .filter(data -> data instanceof Boolean) - .mapToInt(data -> dataList.indexOf(data)) + public void whenUsingIndexOf_thenFindFirstMatchingUserIndex() { + int index = userList.stream() + .filter(user -> searchName.equals(user.getUserName())) + .mapToInt(user -> userList.indexOf(user)) .findFirst() .orElse(-1); assertEquals(1, index); } @Test - public void whenCalled_thenFindIndexUsingStreamIterator() { + public void whenUsingIterator_thenFindFirstMatchingUserIndex() { int index = -1; - Iterator iterator = dataList.iterator(); + Iterator iterator = userList.iterator(); while (iterator.hasNext()) { - Object data = iterator.next(); - if (data instanceof Boolean) { - index = dataList.indexOf(data); + User user = iterator.next(); + if (searchName.equals(user.getUserName())) { + index = userList.indexOf(user); break; } } @@ -42,11 +43,12 @@ public class FirstMatchingElementUnitTest { } @Test - public void whenCalled_thenFindIndexUsingStreamListIterator() { + public void whenUsingListIterator_thenFindFirstMatchingUserIndex() { int index = -1; - ListIterator listIterator = dataList.listIterator(); + ListIterator listIterator = userList.listIterator(); while (listIterator.hasNext()) { - if (listIterator.next() instanceof Boolean) { + if (searchName.equals(listIterator.next() + .getUserName())) { index = listIterator.previousIndex(); break; } @@ -55,20 +57,20 @@ public class FirstMatchingElementUnitTest { } @Test - public void whenCalled_thenFindIndexUsingIntStream() { - int index = IntStream.range(0, dataList.size() - 1) - .filter(streamIndex -> dataList.get(streamIndex) instanceof Boolean) + 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 whenCalled_thenFindIndexUsingStreamTakeWhile() { - int lastIndex = dataList.size() - 1; - int predicateIndex = dataList.stream() - .takeWhile(data -> !(data instanceof Boolean)) - .mapToInt(dataList::indexOf) + public void whenUsingTakeWhile_thenFindFirstMatchingUserIndex() { + int lastIndex = userList.size() - 1; + int predicateIndex = userList.stream() + .takeWhile(user -> !(searchName.equals(user.getUserName()))) + .mapToInt(userList::indexOf) .max() .orElse(-1); @@ -80,14 +82,14 @@ public class FirstMatchingElementUnitTest { } @Test - public void whenCalled_thenFindIndexUsingGoogleGuava() { - int index = Iterables.indexOf(dataList, data -> data instanceof Boolean); + public void whenUsingGoogleGuava_thenFindFirstMatchingUserIndex() { + int index = Iterables.indexOf(userList, user -> searchName.equals(user.getUserName())); assertEquals(1, index); } @Test - public void whenCalled_thenFindIndexUsingApacheCommons() { - int index = IterableUtils.indexOf(dataList, data -> data instanceof Boolean); + public void whenUsingApacheCommons_thenFindFirstMatchingUserIndex() { + int index = IterableUtils.indexOf(userList, user -> searchName.equals(user.getUserName())); assertEquals(1, index); } } From 63b435c0974f08f3f38ae8d0d20cd28a27f51bd6 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Fri, 20 Oct 2023 18:43:27 +0530 Subject: [PATCH 10/18] Method removal for Iterators --- .../FirstMatchingElementUnitTest.java | 30 ------------------- 1 file changed, 30 deletions(-) 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 index d1ca588047..373833e9f7 100644 --- 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 @@ -2,9 +2,7 @@ package com.baeldung.streams.firstmatchingelement; import static org.junit.jupiter.api.Assertions.assertEquals; -import java.util.Iterator; import java.util.List; -import java.util.ListIterator; import java.util.stream.IntStream; import org.apache.commons.collections4.IterableUtils; @@ -28,34 +26,6 @@ public class FirstMatchingElementUnitTest { assertEquals(1, index); } - @Test - public void whenUsingIterator_thenFindFirstMatchingUserIndex() { - int index = -1; - Iterator iterator = userList.iterator(); - while (iterator.hasNext()) { - User user = iterator.next(); - if (searchName.equals(user.getUserName())) { - index = userList.indexOf(user); - break; - } - } - assertEquals(1, index); - } - - @Test - public void whenUsingListIterator_thenFindFirstMatchingUserIndex() { - int index = -1; - ListIterator listIterator = userList.listIterator(); - while (listIterator.hasNext()) { - if (searchName.equals(listIterator.next() - .getUserName())) { - index = listIterator.previousIndex(); - break; - } - } - assertEquals(1, index); - } - @Test public void whenUsingIntStream_thenFindFirstMatchingUserIndex() { int index = IntStream.range(0, userList.size() - 1) From 2f34022dedcdd4c480ed228807ced76b6eed7ff9 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Tue, 31 Oct 2023 18:11:34 +0530 Subject: [PATCH 11/18] Test Case Update --- .../FirstMatchingElementUnitTest.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) 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 index 373833e9f7..48171bab65 100644 --- 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 @@ -3,6 +3,7 @@ package com.baeldung.streams.firstmatchingelement; import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.IntStream; import org.apache.commons.collections4.IterableUtils; @@ -17,12 +18,17 @@ public class FirstMatchingElementUnitTest { private String searchName = "John"; @Test - public void whenUsingIndexOf_thenFindFirstMatchingUserIndex() { + public void whenUsingStream_thenFindFirstMatchingUserIndex() { + AtomicInteger counter = new AtomicInteger(-1); int index = userList.stream() - .filter(user -> searchName.equals(user.getUserName())) - .mapToInt(user -> userList.indexOf(user)) + .filter(user -> { + counter.getAndIncrement(); + return searchName.equals(user.getUserName()); + }) + .map(user -> counter.get()) .findFirst() .orElse(-1); + assertEquals(1, index); } From 2628fe1eb0254330f05010e1219b64c7d9201b2f Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Tue, 7 Nov 2023 23:13:46 +0530 Subject: [PATCH 12/18] Review Comment changes --- .../FirstMatchingElementUnitTest.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) 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 index 48171bab65..2021014957 100644 --- 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 @@ -44,9 +44,13 @@ public class FirstMatchingElementUnitTest { @Test public void whenUsingTakeWhile_thenFindFirstMatchingUserIndex() { int lastIndex = userList.size() - 1; + AtomicInteger counter = new AtomicInteger(-1); int predicateIndex = userList.stream() - .takeWhile(user -> !(searchName.equals(user.getUserName()))) - .mapToInt(userList::indexOf) + .takeWhile(user -> { + counter.getAndIncrement(); + return !(searchName.equals(user.getUserName())); + }) + .mapToInt(user -> counter.get()) .max() .orElse(-1); From c7bd43e881bc52aa1d79f41be942c25f60f3483c Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Tue, 7 Nov 2023 23:14:34 +0530 Subject: [PATCH 13/18] formatting change --- .../FirstMatchingElementUnitTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 index 2021014957..19585a9e9b 100644 --- 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 @@ -46,10 +46,10 @@ public class FirstMatchingElementUnitTest { int lastIndex = userList.size() - 1; AtomicInteger counter = new AtomicInteger(-1); int predicateIndex = userList.stream() - .takeWhile(user -> { - counter.getAndIncrement(); - return !(searchName.equals(user.getUserName())); - }) + .takeWhile(user -> { + counter.getAndIncrement(); + return !(searchName.equals(user.getUserName())); + }) .mapToInt(user -> counter.get()) .max() .orElse(-1); From ab70c92934138684377a2ae99c2c6ae6ff5f484f Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Wed, 8 Nov 2023 22:44:29 +0530 Subject: [PATCH 14/18] Updating map method --- .../firstmatchingelement/FirstMatchingElementUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 19585a9e9b..347dadf961 100644 --- 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 @@ -25,7 +25,7 @@ public class FirstMatchingElementUnitTest { counter.getAndIncrement(); return searchName.equals(user.getUserName()); }) - .map(user -> counter.get()) + .mapToInt(user -> counter.get()) .findFirst() .orElse(-1); From aa357f8b644bdffcba977fdacdb3bb5f687d1b6d Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Thu, 16 Nov 2023 14:43:14 +0530 Subject: [PATCH 15/18] Review comment update --- .../firstmatchingelement/FirstMatchingElementUnitTest.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) 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 index 347dadf961..dbca587ec1 100644 --- 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 @@ -43,7 +43,6 @@ public class FirstMatchingElementUnitTest { @Test public void whenUsingTakeWhile_thenFindFirstMatchingUserIndex() { - int lastIndex = userList.size() - 1; AtomicInteger counter = new AtomicInteger(-1); int predicateIndex = userList.stream() .takeWhile(user -> { @@ -54,11 +53,7 @@ public class FirstMatchingElementUnitTest { .max() .orElse(-1); - if (predicateIndex != 1 && predicateIndex != lastIndex) { - assertEquals(1, predicateIndex + 1); - } else { - assertEquals(lastIndex, predicateIndex); - } + assertEquals(1, predicateIndex + 1); } @Test From 39f5de4e30413ce808e18afd400ff6d42e1f0dc4 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Thu, 23 Nov 2023 20:54:11 +0530 Subject: [PATCH 16/18] Review Comments --- .../FirstMatchingElementUnitTest.java | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) 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 index dbca587ec1..da4522d097 100644 --- 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 @@ -1,20 +1,20 @@ package com.baeldung.streams.firstmatchingelement; -import static org.junit.jupiter.api.Assertions.assertEquals; + +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.assertj.core.util.Lists; import org.junit.Test; import com.google.common.collect.Iterables; public class FirstMatchingElementUnitTest { - private List userList = Lists.newArrayList(new User(1, "David"), new User(2, "John"), new User(3, "Roger"), new User(4, "John")); + 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 @@ -43,17 +43,11 @@ public class FirstMatchingElementUnitTest { @Test public void whenUsingTakeWhile_thenFindFirstMatchingUserIndex() { - AtomicInteger counter = new AtomicInteger(-1); - int predicateIndex = userList.stream() - .takeWhile(user -> { - counter.getAndIncrement(); - return !(searchName.equals(user.getUserName())); - }) - .mapToInt(user -> counter.get()) - .max() - .orElse(-1); - - assertEquals(1, predicateIndex + 1); + long predicateIndex = userList.stream() + .takeWhile(user -> !user.getUserName() + .equals(searchName)) + .count(); + assertEquals(1, predicateIndex); } @Test From 7b83abb7ae45c027906a1df7c71a4cf0607c8649 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Sun, 26 Nov 2023 23:51:38 +0530 Subject: [PATCH 17/18] Review Comments --- .../FirstMatchingElementUnitTest.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) 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 index da4522d097..db9415e94b 100644 --- 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 @@ -44,12 +44,20 @@ public class FirstMatchingElementUnitTest { @Test public void whenUsingTakeWhile_thenFindFirstMatchingUserIndex() { long predicateIndex = userList.stream() - .takeWhile(user -> !user.getUserName() - .equals(searchName)) + .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())); From 6948bc37e283a4b1995465a2d355015a006afeca Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Thu, 14 Dec 2023 19:53:46 +0530 Subject: [PATCH 18/18] Review Comment --- .../firstmatchingelement/FirstMatchingElementUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index db9415e94b..0820138b3b 100644 --- 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 @@ -34,7 +34,7 @@ public class FirstMatchingElementUnitTest { @Test public void whenUsingIntStream_thenFindFirstMatchingUserIndex() { - int index = IntStream.range(0, userList.size() - 1) + int index = IntStream.range(0, userList.size()) .filter(streamIndex -> searchName.equals(userList.get(streamIndex).getUserName())) .findFirst() .orElse(-1);