Dan*_*ark 8 java collections syntax
我目前正在重新发现Java(最近使用Ruby),我喜欢编译所有内容的编译时间.它使重构变得如此简单.但是,我错过了使用类型进行快速和松散的each循环.这是我最糟糕的代码.
这是否尽可能短?我有一个名为的集合looperTracks,它有实现的实例Looper.我不想修改那个集合,但我想迭代它的成员PLUS this(也实现Looper).
List<Looper> allLoopers = new ArrayList<Looper>(looperTracks.length + 1);
for (LooperTrack track : looperTracks) {
allLoopers.add(track);
}
allLoopers.add(this);
for (Looper looper : allLoopers) {
// Finally! I have a looper
Run Code Online (Sandbox Code Playgroud)
我特别关注从1.5开始的Java新功能,我可能已经错过了.对于这个问题,我不是在问JRuby还是Groovy,虽然我知道他们会为此工作.
编辑:对不起(太多的Ruby!)... looperTracks是类型LooperTrack[]和LooperTrack实现Looper.
您至少可以使用以下事实:您可以使用另一个作为基本值构建一个集合.根据文件:
按照集合的迭代器返回的顺序构造一个包含指定集合元素的列表.ArrayList实例的初始容量为指定集合大小的110%.
这意味着可能this没有任何调整大小的空间.
List<Looper> allLoopers = new ArrayList<Looper>(looperTracks);
allLoopers.add(this);
for (Looper looper : allLoopers) {
// Finally! I have a looper
Run Code Online (Sandbox Code Playgroud)
至少有两种可能的内置方法来缩短代码:
您可以使用Collection.addAll(Collection)将作为参数传递的集合中的每个元素追加到集合的末尾:
List<Looper> allLoopers = new ArrayList<Looper>();
...
allLoopers.addAll(looperTracks);
allLoopers.add(this);
for(Looper looper : allLoopers) {
...
}
Run Code Online (Sandbox Code Playgroud)
或者您可以使用将集合作为参数的构造函数:
List<Looper> allLoopers = new ArrayList<Looper>(looperTracks);
Run Code Online (Sandbox Code Playgroud)
由于问题的变化:所有阵列可以容易地转化为使用集合java.util.Arrays中例如
List<Looper> someLooperTracks = Arrays.asList(looperTracks).
Run Code Online (Sandbox Code Playgroud)
这将把数组包装在固定大小的列表中.
我认为你不能让它比这更短......
for (Looper looper : new ArrayList<Looper>(looperTracks){{ add(EnclosingClass.this); }}) {
// Finally! I have all loopers
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2714 次 |
| 最近记录: |