Skip to content
Dima Kruk edited this page Feb 13, 2013 · 4 revisions

Язык Collections разработан для расширения базовых возможностей ActionScript3. Он добавляет функциональность, которая присутствует в современных языках, таких как Scala, Groovy или Ruby. Collections позволяет использовать два типа: List и Map. Map очень похож на Dictionary и содержит ряд полезных методов, которые описаны ниже.

Также есть методы конвертации, весьма полезные для упрощения использования Collections в Ваших текущих pure ActionScript3 проектах. Просто возьмите ваш массив (или вектор) и примените метод .toList. После обработки list Вы всегда можете конвертировать его обратно в old-school AS3 стиль, используя .toArray или .toVector метод.

###Базовые операции с List

###Бинарные операции с List

###Closures операции с List

###Closures операции с элементами List

###Базовые операции с Map

##Создание экземпляра Collections

Вы можете создать экземпляр Collections одним из способов:

// новый list
var myList :list<int> = new list<int>{0, 1, 1, 2, 3, 5, 8, 13};
//  новый map
var myMap :map<String, int> = new map<String, int>{"Hello" = 1, "World" = 2};
// новый map (компактный синтаксис)
var myMap :map<String, int> = { 
  first :1,
  second :2,
  third :3 
};

либо конвертировать Array или Vector:

var myArray :Array = new Array(0, 1, 1, 2, 3, 5, 8, 13);
myList = myArray.toList;
var myVector :Vector.<int> = new <int>[0, 1, 1, 2, 3, 5, 8, 13];
myList = myVector.toList;

##Поддержка Methods Chaining

Да, Collections действительно поддерживают methods chaining, т.е. последовательное применение нескольких вызовов метода.

var l :list<int> = new list<int>{1, 1, 2, 3, 5, 8, 13}; 
l.where{it => it > 5 && it % 2 == 0} 
  .select{it => it.toFixed(2)} 
  .select{it => "number " + it} 
  .forEach{it => trace it};

В нашем примере мы создали list, который может содержать только int значения.

  1. Затем мы выбираем только те, которые удовлетворяют условию (“where”).
  2. Редактируем каждый отобранный элемент (“select”).
  3. Конвертируем их в строки (“select”).
  4. Наконец, мы используем цикл по списку и выводим результат.

where, select, selectMany – эти операции легко использовать, когда вы формируете запрос.

Аналогичный код без использования Collections (pure AS3).

var a :Array = new Array(1, 1, 2, 3, 5, 8, 13); 
var b :Array = new Array(); 
var c :Array = new Array(); 
var d :Array = new Array();

for (var i :int = 0;i < a.length;i++) { 
  if (a[i] > 5 && i[i] % 2 == 0) { 
    b.push(a[i]); 
  } 
} 
for (var j :int = 0;j < b.length;j++) { 
  c.push(j.toFixed); 
} 
for (var k :int = 0;k < c.length;k++) { 
  d.push("number" + j); 
} 
for (var m :int = 0;m < d.length;m++) { 
  trace m; 
}

##Базовые операции с List ###.add( element ) :T

Добавляет элемент в список.

myList.add(a);

###.addAll( list ) :list<T>

Добавляет список элементов к текущему списку, помещая их в конец списка.

myList.addAll(new list<int>{a, b, c});

###.addFirst( element ) :T

Добавляет элемент в начало списка.

myList.addFirst(q); 

###.clear :list<T>

Удаляет все элементы из списка.

myList.clear;

###.contains( element ) :Boolean

Проверяет наличие элемента в списке.

myList.contains(a);

###.containsAll( list ) :Boolean

Проверяет наличие элементов в списке.

myList.containsAll(new list<int>{a, b, c});

###.copy :list<T>

Возвращает копию списка.

myList.copy;

###.cut( numberOfElements ) :list<T>

Возвращает элементы из начала списка, исключая n элементов с конца. Изначальный список не изменяется.

myList.cut(n);

###.distinct :list<T>

Возвращает все уникальные элементы списка.

myList.distinct;

###.first :T

Возвращает первый элемент списка.

myList.first;

###.get( index ) :T

Возвращает элемент с индексом указанным в аргументе.

myList.get(n);

###.head( index ) :list<T>

Возвращает список элементов, начиная с начала до значения аргумента.

myList.head(n);

###.indexOf( element ) :int

Возвращает индекс элемента, указанного в аргументе.

myList.indexOf(n);

###.insert( index, element ) :T

Вставляет элемент в указанную позицию списка.

myList.insert(m, n);

###.isEmpty :Boolean

Проверяет пуст ли список.

myList.isEmpty;

###.isNotEmpty :Boolean

Проверяет не пуст ли список.

myList.isNotEmpty;

###.join( delimiter ) :String

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

myList.join(",");

###.last :T

Вставляет последний элемент списка.

myList.last;

###.page( fromElement, toElement ) :list<T>

Возвращает новый список, состоящий из диапазона элементов исходного списка, не модифицируя исходный список.

myList.page(m, n);

###.remove( element ) :T

Удаляет последний элемент списка.

myList.remove(k);

###.removeAll( list ) :list<T>

Удаляет список элементов из текущего списка.

myList.removeAll(new list<int>{a, b, c}); 

###.removeAt( index ) :T

Удаляет элемент в указанной позиции и возвращает его.

myList.removeAt(n); 

###.removeFirst :T

Удаляет первый элемент и возвращает его.

myList.removeFirst;

###.removeHead( length ) :list<T>

Удаляет указанное количество элементов из списка, начиная с начала, и возвращает их.

myList.removeHead(n);

###.removeLast :T

Удаляет последний элемент и возвращает его.

myList.removeLast;

###.removeTail( length ) :list<T>

Удаляет указанное количество элементов из списка, начиная с конца, и возвращает их.

myList.removeTail(m);

###.reverse :list<T>

Возвращает новый список с элементами в обратном порядке.

myList.reverse;

###.set( index, element ) :T

Помещает элемент в заданную позицию.

myList.set(m, n);

###.size :int

Возвращает размер списка.

myList.size;

###.skip( numberOfElements ) :list<T>

Skip the specified number of elements from the beginning of the current list.

myList.skip(m);

###.subList( fromIndex, toIndex ) :list<T>

Возвращает новый список, состоящий из диапазона элементов исходного списка, не модифицируя исходный список.

myList.subList(m, n); 

###.tail( numberOfElements ) :list<T>

Возвращает указанное количество элементов, начиная с конца списка.

myList.tail (n);

###.toArray :Array

Конвертирует список в массив.

myList.toArray;

###.toVector :Vector<T>

Конвертирует список в вектор.

myList.toVector;

##Бинарные операции с List

###.concat( list ) :list<T>

Создает новый список, соединив текущий с указанным в аргументе.

myList.concat(new list<int>{a, b, c});

###.disjunction( list ) :list<T>

Создает новый список, который является строгой дизъюнкцией исходного и указанного в аргументе.

myList.disjunction(list);

###.except( list ) :list<T>

Создает новый список, исключая элементы указанного в аргументе списка.

myList.except(list);

###.intersect( list ) :list<T>

Создает новый список, который является пересечением исходного и указанного в аргументе.

// intersect myList with a, b and c
myList.intersect(new list<int>{a, b, c}); 

###.union( list ) :list<T>

Создает новый список, соединив текущий с указанным в аргументе.

// combine myList and a, b and c
myList.union(new list<int>{a, b, c}); 

##Closures операции с List

###.all( condition( element ) ) :Boolean

Проверяет, все ли элементы списка удовлетворяют условию.

myList.all{it => it > a};

###.any( condition( element ) ) :Boolean

Проверяет, есть ли элемент списка, который удовлетворяет условию.

myList.any{it => it == b};

###.fill( yield( element ) ) :void

Заполняет список элементами.

myList.fill{=>
  yield a; 
  yield b; 
  yield c; 
};

###.findFirst( condition( element ) ) :T

Возвращает первый удовлетворяющий условию элемент списка.

myList.findFirst{any => any < c};

###.findLast( condition( element ) ) :T

Возвращает последний элемент списка, удовлетворяющий условию.

// the last element of myList that is less than c
myList.findLast{any => any < c};

###.foldLeft( operation( element ), seed )

Выполняет лево-ассоциативную сверку.

var myList :list<int> = new list<int>{1, 2, 3, 4, 5}; 
myList.foldLeft({it, s => it * s}, 2); // assert 240

###.foldRight( operation( element ), seed )

Выполняет право-ассоциативную сверку.

var myList :list<int> = new list<int>{1, 2, 3, 4, 5}; 
myList.foldRight({it, s => it + s}, 10); // assert 25

###.forEach( operation( element ) ) :void

Применяет операцию ко всем элементам списка.

myList.forEach{element => trace element};

###.reduceLeft( operation( elementA, elementB ) )

Выполняет лево-ассоциативную сверку.

var myList :list<int> = new list<int>{1, 2, 3, 4, 5};
myList.reduceLeft{a, b => a + b}; // assert 15

###.reduceRight( operation( elementA, elementB ) )

Выполняет право-ассоциативную сверку.

var myList :list<int> = new list<int>{1, 2, 3, 4, 5}; 
myList.reduceRight{a, b => a * b}; // assert 120

###.removeWhere( condition( element ) ) :list<T>

Удаляет удовлетворяющие условию элементы.

myList.removeWhere{it => it == 0};

###.select( operation( element ) ) :list<T'>

Применяет операцию к каждому элементу и возвращает новый список с результатами.

var myList :list<int> = new list<int>{1, 2, 3}; 
myList.select{it => "|" + it + "|"}; // assert ["|1|", "|2|", "|3|"]

###.selectMany( operation( element ) ) :list<T>

Преобразует каждый элемент списка и возвращает список, содержащий все элементы.

var myList :list<int> = new list<int>{1, 2, 3}; 
myList.selectMany{it => new list<int>{1, 0}}; // assert [1, 0, 1, 0, 1, 0]

###.sort( operation( elementA, elementB ) ) :list<T>

Сортирует список.

var myList :list<int> = new list<int>{1, 2, 3}; 
myList = myList.sort{a, b => b - a}; // reverse sorting, i.e. result is 3, 2, 1

###.where( condition( element ) ) :list<T>

Возвращает список из элементов, удовлетворяющих условию.

myList.where{element => element < b};

###( numberOfTimes ).times( operation(counter ) )

Выполняет операцию указанное количество раз.

var dump :String; 
(3).times({i => dump += "" + i}); // dump == "123"

##Closures операции с элементами List ###.index :int Возвращает индекс элемента.

var c : int = 0; 
[1, 2, 3].toList<int>.forEach{it => assert it.index equals c++};

###.next :T Возвращает следующий элемент.

var c : int = 1; 
var list : list<int> = [1, 2, 3].toList<int>; 
list.forEach{it => 
    if (c != 2) { 
      assert it.next equals list[c++]; 
    } 
  };

###.hasNext :Boolean Проверяет, есть ли следующий элемент.

var c : int = 0; 
var list : list<int> = [1, 2, 3].toList<int>; 
list.forEach{it => 
    if (c++ != 2) { 
      assert it.hasNext; 
    } else { 
      assert !(it.hasNext); 
    } 
  };

###.previous :T Возвращает предыдущий элемент.

var c : int = -1; 
var list : list<int> = [1, 2, 3].toList<int>; 
list.forEach{it => 
    if (c != -1) { 
      assert it.previous equals list[c]; 
    } 
    c++; 
  };

###.hasPrevious :Boolean Проверяет, есть ли предыдущий элемент.

var c : int = 0; 
var list : list<int> = [1, 2, 3].toList<int>; 
list.forEach{it => 
    if (c++ != 0) { 
      assert it.hasPrevious; 
    } else { 
      assert !(it.hasPrevious); 
    } 
  };

##Базовые операции с Map ###.keys :list<keyT>

Возвращает все ключи из map.

myMap.keys;

###.containsKey( key ) :Boolean

Проверяет наличие значения по ключу.

var myMap :map<String, int> = new map<String, int>{"Hello" = 1, "World" = 2}; 
myMap.containsKey("Good bye"); // false
myMap.containsKey("Hello"); // true

###.containsValue( value ) :Boolean

Проверяет наличие значения в map.

var myMap :map<String, int> = new map<String, int>{"Hello" = 1, "World" = 2}; 
myMap.containsValue(4); // false
myMap.containsValue(2); // true

###.clear :map<keyT, valueT>

Удаляет все элементы map.

myMap.clear;

###.putAll( map ) :void

Добавляет все элементы map, указанной в аргументе.

var myMap :map<String, int> = new map<String, int>{"Hello" = 1, "World" = 2};
// "Hello" = 1, "World" = 2, "Lorem" = 3, "Ipsum" = 4}
myMap.putAll(new map<String, int>{"Lorem" = 3, "Ipsum" = 4});

###.removeKey( key ) :valueT

Удаляет ключ из map и возвращает значение.

var myMap :map<String, int> = new map<String, int>{"Hello" = 1, "World" = 2}; 
myMap.removeKey("World"); //myMap={"Hello" = 1}

###.values :list<valueT>

Возвращает все значения из map.

myMap.values;

Clone this wiki locally