我有一个Set实例:
Set<String> siteIdSet = (Set<String>) pContext.getParent().getPropertyValue(getCatalogProperties().getSitesPropertyName());
Run Code Online (Sandbox Code Playgroud)
这pContext.getParent().getPropertyValue()是开箱即用的代码,我无法修改任何控件.
我想从中获取第一个默认元素(总是).但是,我找不到get(index)类似的方法ArrayList.
因此,现在,我这样做.
for (Iterator<String> it = siteIdSet.iterator(); it.hasNext();) {
siteId = it.next();
break;
}
Run Code Online (Sandbox Code Playgroud)
有没有(其他)有效的方法(简短和更好)实现这一目标?
小智 80
这将返回第一个元素
set.iterator().next();
Run Code Online (Sandbox Code Playgroud)
Nes*_*aev 30
或者,使用Java8:
Object firstElement = set.stream().findFirst().get();
Run Code Online (Sandbox Code Playgroud)
然后你可以马上做一些事情:
set.stream().findFirst().ifPresent(<doStuffHere>);
Run Code Online (Sandbox Code Playgroud)
或者,如果您想在缺少元素的情况下提供替代方法(我的示例返回新的默认字符串):
set.stream().findFirst().orElse("Empty string");
Run Code Online (Sandbox Code Playgroud)
如果缺少第一个元素,您甚至可以抛出异常:
set.stream().findFirst().orElseThrow(() -> new MyElementMissingException("Ah, blip, nothing here!"));
Run Code Online (Sandbox Code Playgroud)
荣誉给Alex Vulaj了促使我提供超越第一要素的初始抓取更多的例子.
Tay*_* Hx 29
来自Oracle文档:
正如其名称所暗示的,该界面模拟数学集抽象.
在集合理论中,"一个"集合是一个不同对象的集合,被视为一个独立的对象." - [维基百科 - 集].
在数学上,集合中的元素不是个性化的.他们唯一的身份来自他们在集合中的存在.因此,在集合中获取"第一"元素是没有意义的,因为从概念上讲这样的任务是不合逻辑的.
从集合中获取"first"元素可能没有意义,但如果您只需要从集合中获取单个对象(不保证哪个对象是),则可以执行以下操作:
for(String aSiteId: siteIdSet) {
siteId = aSiteId;
break;
}
Run Code Online (Sandbox Code Playgroud)
这是一个稍微短一些的方法(比你发布的方法)获得a的"第一"对象Set,但是由于Iterator仍在创建(在引擎盖下),它不会给予任何性能优势.
Set是一个独特的项目集合.所以没有第一个元素的概念.如果您想要按排序顺序排列项目,可以使用TreeSet从中使用TreeSet #first()从中检索第一个元素.
移动元素,然后调用first().
new TreeSet<String>(
pContext.getParent().getPropertyValue( … ) // Transfer elements from your `Set` to this new `TreeSet`, an implementation of the `SortedSet` interface.
).first()
Run Code Online (Sandbox Code Playgroud)
Set 没有订单正如其他人所说,Set根据定义,没有秩序.因此,要求"第一"元素没有意义.
某些实现Set具有订单,例如添加项目的顺序.这个非正式的订单可以通过Iterator.但该命令是偶然的,不能保证.如果你很幸运,支持你的实现Set可能确实是一个SortedSet.
CAVEAT:如果订单很重要,请不要依赖此类行为.如果可靠性并不重要,那么这种无证件行为可能会很方便.如果给Set你一个你没有其他可行的选择,所以尝试这可能比没有好.
Object firstElement = mySet.iterator().next();
Run Code Online (Sandbox Code Playgroud)
直接解决问题......不,在处理空集的可能情况时,从迭代器中获取第一个元素并不是更简单的方法.但是,我更喜欢if测试isEmpty而不是问题的for循环.
if ( ! mySet.isEmpty() ) {
Object firstElement = mySet.iterator().next();
)
Run Code Online (Sandbox Code Playgroud)
SortedSet如果您关心在a中维护排序顺序Set,请使用SortedSet实现.这些实现包括:
TreeSet.ConcurrentSkipListSet.SortedSetMultimap该类SortedSet从其asMap方法返回a .LinkedHashSet对于插入顺序如果你需要的只是记住元素的顺序,他们被添加到Set使用a LinkedHashSet.
引用文档,这堂课......
维护一个贯穿其所有条目的双向链表.此链接列表定义迭代排序,即元素插入集合(插入顺序)的顺序.
| 归档时间: |
|
| 查看次数: |
140677 次 |
| 最近记录: |