On Tue, 23 Apr 2024 13:51:54 GMT, Evemose <d...@openjdk.org> wrote: >> **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 bas... > > Evemose has updated the pull request incrementally with three additional > commits since the last revision: > > - Added Objects import to sun List > - Replaced on-demand import in com.sun....List > - added non-null assertions
src/java.base/share/classes/java/util/LinkedList.java line 1507: > 1505: > 1506: public int findLastIndex(Predicate<? super E> filter) { > 1507: return rlist.findLastIndex(filter); Hmm, this view is supposed to be reversed... so last and first need a swap. This is a bug in the current codebase, a good bug to fix indeed. ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/18639#discussion_r1573456708