Мне интересно, есть ли эффективные способы итерации коллекции объектов Java и выполнения некоторых преобразований. Вот пример, который я всегда вижу:
public class MyObject {
int data;
public void run() {
doTransform();
}
.....
}
public class Main {
public static void main(){
Set<MyObject> objs=..
for(MyObject obj: objs){
if(obj.getData() && other conditions ){
obj.run();
}
}
//The iterator are also frequently used here ..
}
}
Лично мне не нравится этот способ, показанный в основном методе, поскольку для этого требуется больше кода ввода, а код не такой чистый... Я предпочитаю способ, используемый в C++ (только одна строка кода). Пример выше:
for_each(obj.begin(), obj.end(), a fun object);
В Java 8 вы можете:
objs.stream()
.filter(o -> o.hasData() && other conditions)
.forEach(MyObject::run);
Трудно представить что-то гораздо более краткие, чем это (по крайней мере, будучи читабельным!). Вот что он делает более подробно:
Stream<MyObject>
для вашего Set<MyObject>
o
такие, что o.hasData() && other conditions
. if
в вашем цикле.run
. MyObject::run
- это только сокращение для o → o.run()
, где o
имеет тип MyObject
.)