While I'm sympathetic to the use-case, I think adding such a method to List is 
the wrong move—you could equally argue that there should be a randomIterator(), 
a randomSet(), a randomAdd(). And it wouldn't be coherent with the 
specification of the List-methods to create a wrapper-type which would perform 
the randomization (i.e. that set(i, e) would add it at a random index rather 
than at i).
It's also important to note that we cannot presume to know what level of 
randomness is required by the developer, so a RandomGenerator would need to be 
provided.

One could, however, argue whether there should be a convenience-method on 
RandomGenerator named something akin to "<T, L extends List<? extends T> & 
RandomAccess> T nextElement(L list)" however the discoverability of said method 
would be less-than-ideal.

This leads me to conclude that it is arguably better as a static utility method 
in the developer's codebase, or inlining it at use-site. After all, it's half a 
line of code, presuming of course that the author has already checked for 
emptiness:

var e = list.get(rand.nextInt(list.size());

vs

public static <T, L extends List<? extends T> & RandomAccess> T 
randomElement(RandomGenerator rand, L list) {
    if(list.isEmpty()) // Implicit null-check of list
        throw new NoSuchElementException();
    else
        return list.get(rand.nextInt(list.size())); // Implicit null-check of 
rand
}

var e = randomElement(rand, list);

Cheers,
√


Viktor Klang
Software Architect, Java Platform Group
Oracle
________________________________
From: core-libs-dev <core-libs-dev-r...@openjdk.org> on behalf of Alan Bateman 
<alan.bate...@oracle.com>
Sent: Sunday, 24 August 2025 11:42
To: Daniel Tavares <cet...@gmail.com>; core-libs-dev@openjdk.org 
<core-libs-dev@openjdk.org>
Subject: Re: Proposal: Add getRandom() default method to java.util.List

On 23/08/2025 20:36, Daniel Tavares wrote:
:

Proposed Method

default T getRandom() {
    if (isEmpty()) return null;
    int index = ThreadLocalRandom.current().nextInt(size());
    return get(index);
}

Add Lists that are mutable and support concurrent access to your list to think 
about. These implementations would need to be updated to implement this method, 
otherwise you risk getting IOOBE with the default method.

-Alan

Reply via email to