RFR: 8329760: Add indexOf(Predicate<? super E> filter) to java..util.List interface

Evemose duke at openjdk.org
Thu Apr 18 22:00:13 UTC 2024


**Subject**
Addition of Predicate-based `indexOf` and `lastIndexOf` methods to `java.util.List`

**Motivation**
The motivation behind this proposal is to enhance the functionality of the `List` interface by providing a more flexible way to find the index of an element. Currently, the `indexOf` and `lastIndexOf` methods only accept an object as a parameter. This limits the flexibility of these methods as they can only find the index of exact object matches.

The proposed methods would accept a `Predicate` as a parameter, allowing users to define a condition that the desired element must meet. This would provide a more flexible and powerful way to find the index of an element in a list.

Here is a brief overview of the changes made in this pull request:

1. Added the `indexOf(Predicate<? super E> filter)` method to the `List` interface.
2. Added the `lastIndexOf(Predicate<? super E> filter)` method to the `List` interface.
3. Implemented these methods in all non-abstract classes that implement the `List` interface.

The changes have been thoroughly tested to ensure they work as expected and do not introduce any regressions. The test cases cover a variety of scenarios to ensure the robustness of the implementation.

For example, consider the following test case:

List<String> list = new ArrayList<>();
list.add("Object one");
list.add("NotObject two");
list.add("NotObject three");

int index1 = list.indexOf(s -> s.contains("ct t"));
System.out.println(index1); // Expected output: 1
int index2 = list.lastIndexOf(s -> s.startsWith("NotObject"));
System.out.println(index2); // Expected output: 2


Currently, to achieve the same result, we would have to use a more verbose approach:

int index1 = IntStream.range(0, list.size())
                     .filter(i -> list.get(i).contains("ct t"))
                     .findFirst()
                     .orElse(-1);
System.out.println(index1); // Output: 1
int index2 = IntStream.range(0, list.size())
                         .filter(i -> list.get(i).startsWith("NotObject"))
                         .reduce((first, second) -> second)
                         .orElse(-1);
System.out.println(index2); // Output: 2


I believe these additions would greatly enhance the functionality and flexibility of the `List` interface, making it more powerful and user-friendly. I look forward to your feedback and am open to making any necessary changes based on your suggestions.

Thank you for considering this proposal.

Best regards

-------------

Commit messages:
 - did some renaming of internal methods utilized by findIndex
 - fixed ReverseOrderLinkedListView
 - fixed javadocs in List and ArrayList
 - Merge remote-tracking branch 'origin/feature/indexOf-with-predicate' into feature/indexOf-with-predicate
 - Removed unused import in AbstractList
 - Also moved to List interface
 - Moved from AbstractList
 - Removed implementation from AbstractList, moving it to List
 - Renamed indexOf(Predicate) and lastIndexOf(Predicate) to findIndex(Predicate) and findLastIndex(Predicate) respectively
 - Merge remote-tracking branch 'origin/feature/indexOf-with-predicate' into feature/indexOf-with-predicate
 - ... and 25 more: https://git.openjdk.org/jdk/compare/16576b87...025bcf39

Changes: https://git.openjdk.org/jdk/pull/18639/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=18639&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8329760
  Stats: 882 lines in 13 files changed: 570 ins; 47 del; 265 mod
  Patch: https://git.openjdk.org/jdk/pull/18639.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/18639/head:pull/18639

PR: https://git.openjdk.org/jdk/pull/18639


More information about the core-libs-dev mailing list