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); + } +}