В сегодняшнем мире, насыщенном данными и интегрированном, мы часто имеем дело с потоками, особенно если вы программист на Java. Однако многие ли из нас (программистов java) знают внутреннюю работу потоков или имеют точку зрения на то, лучше ли поток, чем простой цикл For?
Если вы знаете эти вещи, то я считаю, что этот блог может быть для вас не актуален. Если нет, то давайте копнем глубже.
Поскольку я задал вам этот вопрос, давайте начнем с внутренней работы цикла 'For each'.
for (int x: list)
Это покрытая сахаром строка, в которой заключен внутренний код итерации.
Iterator<Integer> iterator = list.iterator(); while(iterator.hasNext()){ Integer x=iterator.next(); }
Вот что происходит, когда мы вызываем цикл For. Логика заключается в том, что итератор создается поверх кода вашего приложения, и для каждой итерации он будет собирать все, что требуется, и возвращаться к коду приложения.
Невозможно обрабатывать элементы параллельным способом, если мы используем цикл For. С помощью цикла For нелегко реализовать что-то, что будет выполнять с ним более одной операции. Например, если вы хотите изменить элемент списка на верхний регистр, отфильтровать что-то из него, а затем сохранить в списке, то это сложно.
List<String> updatedList=new ArrayList<>(); for(String value:list){ String valueInUpperCase = value.toUpperCase(); if(isMatching(valueInUpperCase)){ updatedList.add(valueInUpperCase); } }
Все эти трудности возникают из-за того, что итерация выполняется в коде, а не в коллекции. Здесь поток имеет простую логику, согласно которой итерация будет выполняться над сбором внутри, а не над кодом приложения. С технической точки зрения это внутренняя итерация, а с циклом for - внешняя итерация кода приложения. Эта логика смягчит обе проблемы, упомянутые выше. поскольку поток выполняет внутреннюю итерацию над коллекцией, его можно быстро обрабатывать параллельно, поскольку нет зависимости одного элемента от другого, а с потоками мы можем довольно легко выполнять более одной операции.
В том же примере, который был затруднен одним циклом For, мы можем вызвать потоки, преобразовать их в верхний регистр и отфильтровать их по мере необходимости.
list.stream().map(x ->x.toUpperCase()).filter(ismatching()).collect(Collectors.toList());
Его гораздо удобнее читать по сравнению с реализацией цикла For.
С учетом всех этих моментов вы можете подумать, что нам следует удалить цикл For из java и везде использовать потоки. Однако это не так. У стримов тоже есть свои недостатки.
Производительность - ›Конечно, с точки зрения производительности простой цикл For лучше, чем поток, поскольку потоки имеют довольно много накладных расходов.
Читаемость -› мы давно знакомы с простым циклом For, а потоки не так уж и стары, если сравнивать его с циклом For. Это одна из причин, по которой мы считаем простой цикл For более читабельным и в некоторой степени правильным. Например, когда мы используем 2 цикла For, один внутри другого, он читается. Тем не менее, когда мы должны делать то же самое в потоках, вы почувствуете, что это сложно. Поэтому я считаю, что все сводится к тому, насколько мы знакомы с потоками.
D Отладка - ›простые циклы For более доступны для отладки, чем потоки, поскольку устаревшие отладчики не оснащены потоками .
В заключение я считаю, что оба потока или цикл For хороши по-своему, и нам, разработчикам, нужно подумать, какой из них использовать в соответствии с нашими требованиями. Нам нужно иметь соответствующие компромиссы и решить, когда использовать потоки, а когда использовать цикл For.