> **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 > > PS: In ...
Evemose has updated the pull request incrementally with two additional commits since the last revision: - Merge remote-tracking branch 'origin/feature/indexOf-with-predicate' into feature/indexOf-with-predicate # Conflicts: # src/java.base/share/classes/java/util/LinkedList.java # src/java.base/share/classes/java/util/ReverseOrderListView.java # src/java.base/share/classes/java/util/Vector.java # test/jdk/java/util/Spliterator/SpliteratorTraversingAndSplittingTest.java - reverted code style changes ------------- Changes: - all: https://git.openjdk.org/jdk/pull/18639/files - new: https://git.openjdk.org/jdk/pull/18639/files/97b9bff4..2c37ecef Webrevs: - full: https://webrevs.openjdk.org/?repo=jdk&pr=18639&range=09 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=18639&range=08-09 Stats: 210 lines in 6 files changed: 11 ins; 44 del; 155 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