Я в настоящее время открываю вновь Java (работающий с Ruby много недавно), и я люблю время компиляции, проверяя всего. Это делает рефакторинг настолько легким. Однако я избегаю играть быстрый-и-свободный с типами, чтобы сделать each
цикл. Это - мой худший код.
Действительно ли это столь коротко, как это может быть? Мне назвали набор looperTracks
, который имеет экземпляры та реализация Looper
. Я не хочу изменять тот набор, но я хочу выполнить итерации через его участников ПЛЮС 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
Я особенно обеспокоен любыми возможностями, которые в новинку для Java от 1,5, на котором я, возможно, отсутствовал. Для этого вопроса я не спрашиваю о JRuby, ни Groovy, хотя я знаю, что они работали бы на это.
Править: Извините (слишком много Ruby!)... looperTracks
имеет тип LooperTrack[]
и LooperTrack
реализации Looper
.
Есть как минимум два возможных встроенных способа сокращения кода:
Вы можете использовать Collection.addAll(Collection), который добавляет каждый элемент коллекции, переданный в качестве параметра в конец коллекции.:
List<Looper> allLoopers = new ArrayList<Looper>();
...
allLoopers.addAll(looperTracks);
allLoopers.add(this);
for(Looper looper : allLoopers) {
...
}
или вы можете использовать конструктор, который принимает коллекцию в качестве параметра:
List<Looper> allLoopers = new ArrayList<Looper>(looperTracks);
В связи с изменением вопроса: Все массивы можно легко преобразовать в коллекции, используя java.util.Arrays, например,
List<Looper> someLooperTracks = Arrays.asList(looperTracks).
Это обернет массив в список фиксированного размера .
Вы можете, по крайней мере, использовать тот факт, что вы можете построить одну коллекцию, используя другую в качестве базовых значений. В соответствии с docs:
строит список, содержащий элементы указанной коллекции, в порядке их возврата итератором коллекции. Экземпляр ArrayList имеет начальную емкость 110% от размера указанной коллекции.
Это означает, что, вероятно, будет место для этой
коллекции без необходимости изменять ее размер.
List<Looper> allLoopers = new ArrayList<Looper>(looperTracks);
allLoopers.add(this);
for (Looper looper : allLoopers) {
// Finally! I have a looper
import ConfigParser
class MyConfigParser(ConfigParser.RawConfigParser):
def get(self, section, option):
val = ConfigParser.RawConfigParser.get(self, section, option)
return val.strip('"')
if __name__ == "__main__":
#config = ConfigParser.RawConfigParser()
config = MyConfigParser()
config.read(["example.cfg"])
print config.get('GENERAL', 'onekey')
-121--2685282- Я не думаю, что вы можете сделать его короче этого...
for (Looper looper : new ArrayList<Looper>(looperTracks){{ add(EnclosingClass.this); }}) {
// Finally! I have all loopers
}
Я только что реализовал итератор s (он реализован в более надежном / проверенном / рассмотренном виде Guava ITERABLABLABLES.CONCAT (ITERABLE ...)
):
// make a concatenation of iterables
public static <T> Iterable<T> $(final Iterable<T> first, final Iterable<T>... iterables) {
List<Iterator<T>> allIterables = new LinkedList<Iterator<T>>();
allIterables.add(first.iterator());
for (Iterable<T> iterable : iterables) {
allIterables.add(iterable.iterator());
}
final Iterator<Iterator<T>> iterators = allIterables.iterator();
return new Iterable<T>() {
@Override
public Iterator<T> iterator() {
return new Iterator<T>() {
private Iterator<T> current = iterators.next();
@Override
public boolean hasNext() {
if (current.hasNext()) {
return true;
} else {
if (iterators.hasNext()) {
current = iterators.next();
return current.hasNext();
} else {
return false;
}
}
}
@Override
public T next() {
return current.next();
}
@Override
public void remove() {
}
};
}
};
}
Использование его кода становится:
for (Looper looper : $($(looperTracks), this)) {
}
В том случае, если вы заботитесь, что реализация является частью моей библиотеки доллара ( ReleSead как LGPL3).
Если вы не хотите использовать Groovy или JRuby из-за своего динамического характера, вы должны рассмотреть возможность использования Scala. Scala статически типизирована, но более лаконична, чем Java.
Это требование, которое вы собираете все в одном списке? Если нет, что с этим с этим?
for (Looper looper : looperTracks) {
doSomething(looper);
}
doSomething(this);
Гуава делает эту довольно легко:
for (Looper looper : ObjectArrays.concat(looperTracks, this)) {}
здесь - это документация для метода ObjectRays # Concat
.
Почему вы не можете просто добавить их все как часть вызова конструктора?
List<Looper> allLoopers = new ArrayList<Looper>(looperTracks);
allLoopers.add(this);
for(Looper looper : allLoopers) {
...
}
В зависимости от набора текста можно использовать:
List<Looper> allLoopers = new ArrayList<Looper>(looperTracks);
allLoopers.add(this);
или:
List<Looper> allLoopers = new ArrayList<Looper>(looperTracks.length + 1);
allLoopers.addAll(looperTracks);
allLoopers.add(this);
Попробуйте
Looper[] loop = new Looper[looperTracks.length + 1];
System.arraycopy(looperTracks, 0, loop, 0, looperTracks.length);
loop[looperTracks.length] = this;
for (Looper l : loop) { ... }
, но, честно говоря, почему бы не просто петлю через существующий массив , а потом делай все, что вы хотите сделать с циклом в
потом потом?
Список
- Отверженность вышеуказанного выглядит как:
List<Looper> loop = new ArrayList<Looper>(Arrays.asList(looperTracks));
loop.add(this);
for (Looper l : loop) { ... }
Вы можете попробовать использовать неизменяемый список , используя метод NCOPIES ()
. Цитата из ссылки API,
общедоступные статические
список NCOPIES (INT N, T O) возвращает неизмеренный список, состоящий из из n копий указанного объекта. Вновь выделенные объект данных крошечный (он содержит единую ссылку к объекту данных). Этот метод есть полезно в сочетании с List.addall Метод для выращивания списков. То Возвращенный список сериализуется.
Это позволит избежать первой итерации Foreach.
Я просто выкину это на ветер, но не пытайтесь сделать ваш код короче за счет того, что он будет читабельным.
Читабельный код всегда является моей целью, когда я начинаю писать код, просто потому, что я знаю, что в какой-то момент в будущем либо я сам, либо кто-то другой будет смотреть на него и должен будет понять его.