语言技巧缩短我的Java代码?

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.

Yac*_*oby 8

您至少可以使用以下事实:您可以使用另一个作为基本值构建一个集合.根据文件:

按照集合的迭代器返回的顺序构造一个包含指定集合元素的列表.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)


Ale*_*aho 7

至少有两种可能的内置方法来缩短代码:

您可以使用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)

这将把数组包装在固定大小的列表中.


Vik*_*ang 6

我认为你不能让它比这更短......

for (Looper looper : new ArrayList<Looper>(looperTracks){{ add(EnclosingClass.this); }}) {
    // Finally! I have all loopers
}
Run Code Online (Sandbox Code Playgroud)

  • @Kevin,你知道,我认为在评论之前实际上回答这些问题不会对你造成伤害.标题恰好是:"缩短我的Java代码的语言技巧?" 而不是"图书馆可以使这些代码可读吗?" 此外,我迫不及待地等待你的短语诀窍解决方案.我会买一些爆米花等待节目. (3认同)
  • -1每次有人发布这个黑客攻击时,我都觉得有必要把它称为可怕的,丑陋的黑客攻击.而且你已经设法使用*两个最晦涩的语言功能 - 实例初始化器,以及对`this`的限定引用!好工作让你所有的同事感到困惑.另外,有多少读者,即使你理解了这一点,也可以告诉我们你的头脑是先处理还是最后处理?我有一个猜测,但我错了,尽管我有12年的全职Java经验.对不起,但是很糟糕. (2认同)