Skip to content

Commit e8c97fd

Browse files
authored
BAEL-7062 - Fetching Index from List using Streams (#14914)
* Primary Commit * More Cases covered * Indentation Corrections on POM * Merge Conflict Fixed * Updating as per Jira comments * Correction * Review Comment Implementation * Indentation fixes * Review Comment Implementation * Method removal for Iterators * Test Case Update * Review Comment changes * formatting change * Updating map method * Review comment update * Review Comments * Review Comments
1 parent 4b176f5 commit e8c97fd

3 files changed

Lines changed: 98 additions & 0 deletions

File tree

core-java-modules/core-java-streams-5/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@
4848
<artifactId>guava</artifactId>
4949
<version>${guava.version}</version>
5050
</dependency>
51+
<dependency>
52+
<groupId>org.apache.commons</groupId>
53+
<artifactId>commons-collections4</artifactId>
54+
<version>${commons-collections4.version}</version>
55+
</dependency>
5156
</dependencies>
5257

5358
<build>
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.baeldung.streams.firstmatchingelement;
2+
3+
public class User {
4+
5+
private String userName;
6+
private Integer userId;
7+
8+
public User(Integer userId, String userName) {
9+
this.userId = userId;
10+
this.userName = userName;
11+
}
12+
13+
public String getUserName() {
14+
return userName;
15+
}
16+
17+
public Integer getUserId() {
18+
return userId;
19+
}
20+
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.baeldung.streams.firstmatchingelement;
2+
3+
4+
import static org.junit.Assert.assertEquals;
5+
6+
import java.util.List;
7+
import java.util.concurrent.atomic.AtomicInteger;
8+
import java.util.stream.IntStream;
9+
10+
import org.apache.commons.collections4.IterableUtils;
11+
import org.junit.Test;
12+
13+
import com.google.common.collect.Iterables;
14+
15+
public class FirstMatchingElementUnitTest {
16+
17+
private List<User> userList = List.of(new User(1, "David"), new User(2, "John"), new User(3, "Roger"), new User(4, "John"));
18+
private String searchName = "John";
19+
20+
@Test
21+
public void whenUsingStream_thenFindFirstMatchingUserIndex() {
22+
AtomicInteger counter = new AtomicInteger(-1);
23+
int index = userList.stream()
24+
.filter(user -> {
25+
counter.getAndIncrement();
26+
return searchName.equals(user.getUserName());
27+
})
28+
.mapToInt(user -> counter.get())
29+
.findFirst()
30+
.orElse(-1);
31+
32+
assertEquals(1, index);
33+
}
34+
35+
@Test
36+
public void whenUsingIntStream_thenFindFirstMatchingUserIndex() {
37+
int index = IntStream.range(0, userList.size() - 1)
38+
.filter(streamIndex -> searchName.equals(userList.get(streamIndex).getUserName()))
39+
.findFirst()
40+
.orElse(-1);
41+
assertEquals(1, index);
42+
}
43+
44+
@Test
45+
public void whenUsingTakeWhile_thenFindFirstMatchingUserIndex() {
46+
long predicateIndex = userList.stream()
47+
.takeWhile(user -> !user.getUserName().equals(searchName))
48+
.count();
49+
assertEquals(1, predicateIndex);
50+
}
51+
52+
@Test
53+
public void whenUsingTakeWhile_thenFindIndexFromNoMatchingElement() {
54+
List<User> userList = List.of(new User(1, "David"), new User(2, "Vick"), new User(3, "Roger"), new User(4, "James"));
55+
long predicateIndex = userList.stream()
56+
.takeWhile(user -> !user.getUserName().equals(searchName))
57+
.count();
58+
assertEquals(4, predicateIndex);
59+
}
60+
61+
@Test
62+
public void whenUsingGoogleGuava_thenFindFirstMatchingUserIndex() {
63+
int index = Iterables.indexOf(userList, user -> searchName.equals(user.getUserName()));
64+
assertEquals(1, index);
65+
}
66+
67+
@Test
68+
public void whenUsingApacheCommons_thenFindFirstMatchingUserIndex() {
69+
int index = IterableUtils.indexOf(userList, user -> searchName.equals(user.getUserName()));
70+
assertEquals(1, index);
71+
}
72+
}

0 commit comments

Comments
 (0)