Приемы языка для сокращения моего кода Java? [закрытый]

Я в настоящее время открываю вновь 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.

8
задан Dan Rosenstark 1 February 2010 в 12:26
поделиться

12 ответов

Есть как минимум два возможных встроенных способа сокращения кода:

Вы можете использовать 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). 

Это обернет массив в список фиксированного размера .

7
ответ дан 5 December 2019 в 05:19
поделиться

Вы можете, по крайней мере, использовать тот факт, что вы можете построить одну коллекцию, используя другую в качестве базовых значений. В соответствии с docs:

строит список, содержащий элементы указанной коллекции, в порядке их возврата итератором коллекции. Экземпляр ArrayList имеет начальную емкость 110% от размера указанной коллекции.

Это означает, что, вероятно, будет место для этой коллекции без необходимости изменять ее размер.

List<Looper> allLoopers = new ArrayList<Looper>(looperTracks);
allLoopers.add(this);

for (Looper looper : allLoopers) {
    // Finally! I have a looper
8
ответ дан 5 December 2019 в 05:19
поделиться
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
}
6
ответ дан 5 December 2019 в 05:19
поделиться

Я только что реализовал итератор 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).

2
ответ дан 5 December 2019 в 05:19
поделиться

Если вы не хотите использовать Groovy или JRuby из-за своего динамического характера, вы должны рассмотреть возможность использования Scala. Scala статически типизирована, но более лаконична, чем Java.

1
ответ дан 5 December 2019 в 05:19
поделиться

Это требование, которое вы собираете все в одном списке? Если нет, что с этим с этим?

for (Looper looper : looperTracks) {
    doSomething(looper);
}
doSomething(this);
1
ответ дан 5 December 2019 в 05:19
поделиться

Гуава делает эту довольно легко:

for (Looper looper : ObjectArrays.concat(looperTracks, this)) {}

здесь - это документация для метода ObjectRays # Concat .

4
ответ дан 5 December 2019 в 05:19
поделиться

Почему вы не можете просто добавить их все как часть вызова конструктора?

List<Looper> allLoopers = new ArrayList<Looper>(looperTracks);

allLoopers.add(this);

for(Looper looper : allLoopers) {
...
}
1
ответ дан 5 December 2019 в 05:19
поделиться

В зависимости от набора текста можно использовать:

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);
1
ответ дан 5 December 2019 в 05:19
поделиться

Попробуйте

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) { ... }
1
ответ дан 5 December 2019 в 05:19
поделиться

Вы можете попробовать использовать неизменяемый список , используя метод NCOPIES () . Цитата из ссылки API,

общедоступные статические список NCOPIES (INT N, T O)

возвращает неизмеренный список, состоящий из из n копий указанного объекта. Вновь выделенные объект данных крошечный (он содержит единую ссылку к объекту данных). Этот метод есть полезно в сочетании с List.addall Метод для выращивания списков. То Возвращенный список сериализуется.

Это позволит избежать первой итерации Foreach.

0
ответ дан 5 December 2019 в 05:19
поделиться

Я просто выкину это на ветер, но не пытайтесь сделать ваш код короче за счет того, что он будет читабельным.

Читабельный код всегда является моей целью, когда я начинаю писать код, просто потому, что я знаю, что в какой-то момент в будущем либо я сам, либо кто-то другой будет смотреть на него и должен будет понять его.

0
ответ дан 5 December 2019 в 05:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: