2017-02-06 5 views
2

кодЕсть ли более короткий способ написать цикл for в Java?

for(int i = 0; i < max; i++) { 
    //do something 
} 

Я использую именно этот код много раз, когда я программа, всегда начиная с 0 и используя интервал я ++. Существует только одна переменная, которая изменяется (макс.)

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

Я знаю, что в python есть функция диапазона, которая намного быстрее набирается.

+2

В зависимости от ситуации можно использовать для каждого цикла или [потоков Java 8] (https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html) , –

+0

Если вы используете eclipse IDE, для петель есть сокращение. Таким образом, вы можете ввести только несколько символов, и все готово. – Alp

+5

Вы также можете написать свою собственную сокращенную функцию 'doInRange (int max, IntConsumer whatToDo)' –

ответ

0

Если вы используете Java 8, вы можете использовать IntStream.range(min, max).foreach(i ->{})

+2

ОП специально запросил более короткий путь. По моему счету, «IntStream.range (мин, макс.)».foreach (() -> 'не короче, чем' for (int i = 0; i yshavit

+0

очень смешно ... Это просто лучший способ использовать лямбда в Java, более читаемый. Короче это не значит лучше. – Piotrowy

+1

Я лично не считаю это более удобочитаемым. :) Но это входит в сферу мнений. Я читаю цикл 'for' уже более 25 лет, поэтому на данный момент они довольно второстепенные, особенно когда они следуют стандартным шаблонам« 0; yshavit

1

Когда цикл по коллекции, вы можете использовать расширенные петли:

int[] numbers = 
{1,2,3,4,5,6,7,8,9,10}; 

for (int item : numbers) { 
    System.out.println(item); 
} 
+0

Правда, но что, если я хочу 1000 итераций? Никто не собирается писать 1000 элементов массива. Количество итераций также фиксируется и во время компиляции. --- Если бы у нас был препроцессор! Просто шучу, мы могли бы также обменять на C++ для этого. – byxor

+0

Ну, я просто использовал это в качестве примера. Улучшенный цикл может использоваться в любой коллекции - основной точкой является синтаксис for (int item: numbers), а не использование чего-то вроде (int i = 0; i Abdulgood89

0

Во многих случаях максимальное значение неизвестно (данные из файлов, баз данных и т.д. .). Для меня лучше всего загружать все в List (ArrayList и т. Д.) И использовать для каждого цикла. На мой взгляд, объединение через подборки - лучший способ синтаксиса короткого цикла.

+0

Это хорошо, если все данные вписываются в память, хотя при преобразовании чего-то, что читает из файлов, в что-то, что загружает все в список, сначала означает, что он должен * полностью помещаться в памяти, где раньше это не обязательно. –

+0

Да, но вы можете частично загрузить данные и использовать их в цикле for-each. –

+0

Вы имеете в виду кучу? – Ellisan

1

Поскольку несколько человек просили что-то вроде этого, вот несколько вещей, которые вы могли бы сделать, хотя ли это на самом деле лучше спорно и дело вкуса:

void times(int n, Runnable r) { 
    for (int i = 0; i < n; i++) { 
     r.run(); 
    } 
} 

Использование:

times(10,() -> System.out.println("Hello, world!")); 

Или:

void times(int n, IntConsumer consumer) { 
    for (int i = 0; i < n; i++) { 
     consumer.accept(i); 
    } 
} 

Использование:

times(10, x -> System.out.println(x+1)); 

Или:

void range(int lo, int hi, IntConsumer consumer) { 
    for (int i = lo; i < hi; i++) { 
     consumer.accept(i); 
    } 
} 

Использование:

range(1, 11, x -> System.out.println(x)); 

Это всего лишь несколько идей. Разработанный вдумчиво, помещенный в общую библиотеку и используемый последовательно, они могли бы сделать общий, идиоматический код кратким, но читаемым. Используемые беззаботно, они могли бы превратить иначе простой код в неуправляемый беспорядок. Я сомневаюсь, что все двое разработчиков никогда не договорятся о том, где именно следует рисовать линии.

Смежные вопросы