Объедините шаблон Bean с Builder. У вашего объекта не будет несогласованного состояния на полпути его конструкции, но он все равно займет 20+ заданных операций, и вы можете сделать свой объект неизменным (если хотите), но не YourObjectBuilder.
public class YourObject {
private Type field1;
private Type field2;
private Type field3;
...
YourObject ( Type field1 , Type field2 , Type field3 ... ) { }
}
public class YourObjectBuilder {
private Type field1;
private Type field2;
private Type field3;
...
public YourObjectBuilder() {
}
public YourObject make ( ) {
return new YourObject ( field1 , field2 , field3 ... ) ;
}
public void setField1(Type t) {
field1 = t;
}
public void setField2(Type t) {
field2 = t;
}
public void setField3(Type t) {
field3 = t;
}
...
}
Одним из решений, эквивалентным вашему коду, может быть
artists = [track['artists'][0]['name'] for track in songs['tracks']]
Прежде всего, то, что вы делаете - это операция «map» (преобразование элементов одного массива в другой массив / список), а не операция «filter» (удаление определенных элементов, соответствующих условию, из массив / список).
Во-вторых, вы не должны зацикливаться на диапазоне. Это цикл for in
, а не традиционный цикл for
, поэтому здесь нет индекса. Вместо этого каждая итерация содержит элемент в списке / массиве.
artists = []
for track in songs['tracks']:
artists.append(track['artists'][0]['name'])
Вы можете превратить это в однострочник, используя списки . Они принимают общую предпосылку итерации по списку для создания нового списка, возможно, трансформируя результаты и, возможно, фильтруя результаты. Синтаксис, который они используют:
result = [ <transformation> for item in items if <condition> ]
В вашем случае у вас нет явной необходимости в условии, поскольку вы просто отображаете один набор значений массива в другой, например:
[ 112]Однако, если бы вы фильтровали, то если бы условие было тем, что вы бы использовали. Например
artists_with_long_songs = [ track[artists][0]['name'] for track in songs['tracks'] if track['length'] > 600 ]