有一个简单的 Set<T>
,如何以一种好的方式(快速、代码行数少)获取Set
中的任何值?
对于List
来说,很容易:
List<T> things = ...;
return things.get(0);
然而,在Set
中,没有.get(...)
方法,因为Set
不是有序的。
有了流(Stream)的存在,你也可以这样操作,但是需要使用 java.util.Optional
类。 Optional
是一个包装类,用于表示一个元素或明确地没有元素(避免空指针异常)。
//returns an Optional.
Optional <T> optT = set.stream().findAny();
//Optional.isPresent() yields false, if set was empty, avoiding NullpointerException
if(optT.isPresent()){
//Optional.get() returns the actual element
return optT.get();
}
编辑:
由于我自己经常使用Optional
:有一种方法可以访问元素或获取默认值,如果它不存在:
optT.orElse(other)
返回元素或者,如果不存在,则返回other
。other
可以是null
,顺便说一下。
set.iterator().next();
快还是慢。 - GustavoHashMap<K,V> map;
List<K> list = new ArrayList<V>(map.keySet()); // min/max of keys
min = max = list.get(0).some_property(); // initialisation step
for(i=list.size();i-->1;){
if( min > list.get(i).some_property() ){ ... }
...
}
或者可以使用迭代器进行循环,使用一个标志来表示min/max需要初始化,并使用条件语句来检查该标志是否在循环的所有迭代中设置。这意味着需要进行大量的条件检查。
boolean flag = true;
Iterator it = map.keySet().iterator();
while( it.hasNext() ){
if( flag ){
// initialisation step
min = max = it.next().some_property();
flag = false;
} else {
if( min > list.get(i).some_property() ){ min = list.get(i).some_property() }
...
}
}
或者在循环外进行初始化:
HashMap<K,V> map;
Iterator it = map.keySet().iterator();
K akey;
if( it.hasNext() ){
// initialisation step:
akey = it.next();
min = max = akey.value();
do {
if( min > list.get(i).some_property() ){ min = akey.some_property() }
} while( it.hasNext() && ((akey=it.next())!=null) );
}
iterator().next()
。这就是为什么我们没有getFirst(Iterable<E>)
,只有getFirst(Iterable<E>, E default)
的原因。 - Louis Wasserman