Re: Possible addition of a default 'getOne' method on Iterable?

2018-01-31 Thread Paul Sandoz
See also Stream.findFirst and findAny. Stream is the place we have and I think 
we should primarily focus effort on rather than Iterable for such features.

I believe a related feature some have requested is the ability to obtain an 
only, or at most, one element. On Stream this might manifest as:

  T findOne(); 
  Optional findAtMostOne(); 
  // See Guava’s MoreCollectors/onlyElement,toOptional [1]

which might differ in terms of exceptions thrown compared to other terminal 
operations.

Paul.

[1] 
https://google.github.io/guava/releases/21.0/api/docs/com/google/common/collect/MoreCollectors.html#onlyElement--
 



> On Jan 30, 2018, at 10:09 PM, Dave Brosius  wrote:
> 
> Basically, but it's
> 
> annoying and ugly to write
> 
> most likely sub-optimal
> 
> has problems with things like synchronized collections
> 
> 
> On 01/31/2018 12:28 AM, Zheka Kozlov wrote:
>> Isn't iterable.getOne() the same as iterable.iterator().next()?
>> 
>> 2018-01-31 12:15 GMT+07:00 Dave Brosius > >:
>> 
>>Greetings,
>> 
>> 
>>sorry if this has been asked before, but has there been any
>>consideration for adding a
>> 
>>default T getOne() {
>> 
>>Iterator it = iterator();
>>if (!it.hasNext()) {
>>throw new NoSuchElementException();
>>}
>> 
>>return it.next();
>>}
>> 
>> 
>>on the Iterable interface?
>> 
>> 
>>It is often the case you have a collection of some sort (un
>>indexed, in this case), where you know there is only one value in
>>the collection, or you know for some attribute of all the objects
>>in the Iterable, all objects can be thought of as the same, and so
>>you just want to get any of the elements.
>> 
>>Having to craft this iterator code is annoying, and it would be
>>much nicer to be able to do
>> 
>>String s = mySet.getOne();
>> 
>>In addition to this, it is likely that most collections could
>>implement getOne() more optimally than using the standard iterator
>>approach.
>> 
>>Of course i am not stuck on the choice of the name 'getOne'
>>anything would do. examplar() ?  As we know, naming is always the
>>hardest part.
>> 
>>thoughts?
>>dave
>> 
>> 
> 



Re: Possible addition of a default 'getOne' method on Iterable?

2018-01-30 Thread Dave Brosius

Basically, but it's

annoying and ugly to write

most likely sub-optimal

has problems with things like synchronized collections


On 01/31/2018 12:28 AM, Zheka Kozlov wrote:

Isn't iterable.getOne() the same as iterable.iterator().next()?

2018-01-31 12:15 GMT+07:00 Dave Brosius >:


Greetings,


sorry if this has been asked before, but has there been any
consideration for adding a

default T getOne() {

    Iterator it = iterator();
    if (!it.hasNext()) {
    throw new NoSuchElementException();
    }

    return it.next();
}


on the Iterable interface?


It is often the case you have a collection of some sort (un
indexed, in this case), where you know there is only one value in
the collection, or you know for some attribute of all the objects
in the Iterable, all objects can be thought of as the same, and so
you just want to get any of the elements.

Having to craft this iterator code is annoying, and it would be
much nicer to be able to do

String s = mySet.getOne();

In addition to this, it is likely that most collections could
implement getOne() more optimally than using the standard iterator
approach.

Of course i am not stuck on the choice of the name 'getOne'
anything would do. examplar() ?  As we know, naming is always the
hardest part.

thoughts?
dave






Re: Possible addition of a default 'getOne' method on Iterable?

2018-01-30 Thread Zheka Kozlov
Isn't iterable.getOne() the same as iterable.iterator().next()?

2018-01-31 12:15 GMT+07:00 Dave Brosius :

> Greetings,
>
>
> sorry if this has been asked before, but has there been any consideration
> for adding a
>
> default T getOne() {
>
> Iterator it = iterator();
> if (!it.hasNext()) {
> throw new NoSuchElementException();
> }
>
> return it.next();
> }
>
>
> on the Iterable interface?
>
>
> It is often the case you have a collection of some sort (un indexed, in
> this case), where you know there is only one value in the collection, or
> you know for some attribute of all the objects in the Iterable, all objects
> can be thought of as the same, and so you just want to get any of the
> elements.
>
> Having to craft this iterator code is annoying, and it would be much nicer
> to be able to do
>
> String s = mySet.getOne();
>
> In addition to this, it is likely that most collections could implement
> getOne() more optimally than using the standard iterator approach.
>
> Of course i am not stuck on the choice of the name 'getOne' anything would
> do. examplar() ?  As we know, naming is always the hardest part.
>
> thoughts?
> dave
>
>


Possible addition of a default 'getOne' method on Iterable?

2018-01-30 Thread Dave Brosius

Greetings,


sorry if this has been asked before, but has there been any 
consideration for adding a


default T getOne() {

    Iterator it = iterator();
    if (!it.hasNext()) {
    throw new NoSuchElementException();
    }

    return it.next();
}


on the Iterable interface?


It is often the case you have a collection of some sort (un indexed, in 
this case), where you know there is only one value in the collection, or 
you know for some attribute of all the objects in the Iterable, all 
objects can be thought of as the same, and so you just want to get any 
of the elements.


Having to craft this iterator code is annoying, and it would be much 
nicer to be able to do


String s = mySet.getOne();

In addition to this, it is likely that most collections could implement 
getOne() more optimally than using the standard iterator approach.


Of course i am not stuck on the choice of the name 'getOne' anything 
would do. examplar() ?  As we know, naming is always the hardest part.


thoughts?
dave