Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > kemsky

Оценить эту запись

Замена для Array - Stream

Запись от kemsky размещена 05.10.2015 в 00:19
Обновил(-а) kemsky 13.10.2015 в 14:36 (update info)

В последнее время часто приходилось писать на as3, причем немало кода связано с перебором коллекций, проверкой условий на коллекции. Существующие варианты Array, ArrayCollection,Vector,ArrayList конечно дело свое делают, но некоторые вещи писать не очень приятно и не универсально (для каждого класса нужен конвертер или хелпер):
Код AS1/AS2:
var a:Array = [1, 2, 3];
var b:Array = a.filter(function(item:Number, index:uint, array:Array):Boolean
{
   return item > 2; 
});
Параметры коллбэка ( index:uint, array:Array) используются редко, но прописывать их надо. А если захочется еще чего-то? Посчитать количество, сконвертить в объект, склеить массив массивов в один, сгруппировать вычислить максимум? Выражения становятся большими, появляются циклы и тд. В яваскрипте у массивов есть метод reduce, у нас нет...

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

Можно перейти и сразу посмотреть полное
описание здесь. Библиотека собирается maven, автоматически тестируется на travis ci, cobertura показывает 100% покрытие тестами.

Несоколько примеров:
Код AS1/AS2:
//create empty Stream
//$ - is provided global function
var s:Stream = $(); 
var s:Stream = new Stream();
 
//create Stream from arguments, array or ArrayCollection
var s:Stream = $(1, 2 , 3);
var s:Stream = $([1, 2, 3]);
var s:Stream = $(new ArrayCollection([1, 2, 3]));
 
trace(s.join(","));
//prints 1,2,3
 
//first, second third etc.
trace(s.first);
//prints 1
 
//access by negative index (like Ruby arrays)
trace(s[3], s[-1]);
//prints 3,3
 
trace(s.unique);
//prints true
 
trace(s.empty)
//prints false
 
trace(s.contains(1))
//prints true
 
var sum2:Number = $(0, 1, 2, 3, 4).foldRight(function (prev:Number, current:Number):Number
{
   return prev + current;
}, 10);
trace(sum2);
//prints 20
 
public class Item
{
  public var name:String;
  public var price:Number;
}
 
var item1:Item = new Item("1", 1);
var item2:Item = new Item("2", 2);
var s:Stream = $(item1, item2);
 
// 1. using custom callback
var result:Stream = s.filter(function(item:Item):Boolean{
   return item.price > 1;
});
 
// 2. using provided global functions
var result:Stream = s.filter(gt(prop("price"), 1));
 
// 3. using Proxy magick and global functions
var result:Stream = s.price(gt(_, 1)); 
 
//all three provide identical results
//prints 1, 2, 3
 
var item1:Item = new Item("car", 1);
var item2:Item = new Item("truck", 2);
var s:Stream = $(item1, item2);
 
var prices:Stream = s..price;
 
trace(prices);
//prints 1,2
Пишу здесь ради ценных советов, ну и может пригодится кому.
Всего комментариев 7

Комментарии

Старый 06.10.2015 14:43 GBee вне форума
GBee
 
Аватар для GBee
Почему именно оберткой, а не утилитой?
Старый 06.10.2015 15:25 kemsky вне форума
kemsky
Обертка позволяет писать цепочки:
Код AS3:
var s:Stream = $([1, 2, 3], [2, 3]);
s.flatten().filter(gt(_, 1));
//2,3,2,3
Старый 06.10.2015 15:45 GBee вне форума
GBee
 
Аватар для GBee
Я этого стремления к с трудом читаемому минимализму не очень понимаю.
Старый 06.10.2015 15:58 kemsky вне форума
kemsky
Основное тут не столько функции типа gt(это больше эксперимент), сколько возможность использовать методы fold, flatten, flatMap и другие, которые давно есть в других языках или, например, вместо a[a.length - 1] = b писать s.last = b.
Старый 08.10.2015 08:56 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Цитата:
Я этого стремления к с трудом читаемому минимализму не очень понимаю.
Да
,
ведь
даже
в
настоящих
языках
слова
они
все
на
новой
строчке
это
удобней
очень


Это максимум дело привычки, что цепочки непонятны.
Код AS3:
arr.flatten.map( x -> x > 5).sum
читаемей и понятней, чем
Код AS3:
arr = Array.flatten(arr);
arr = Array.map(arr);
arr = Array.map x ->
   return x > 5
return Array.sum(arr);
Старый 09.10.2015 18:26 kemsky вне форума
kemsky
js не стоит на месте https://developer.mozilla.org/en-US/..._Objects/Array

добавили в es6 итераторы, под них новые циклы, стрелочки чтобы не писать function(),надо будет посмотреть.

Код AS3:
Array.of(1, 2, 3) // Similar to new Array(...), but without special one-arg behavior
[0, 0, 0].fill(7, 1) // [0,7,7]
[1, 2, 3].find(x => x == 3) // 3
[1, 2, 3].findIndex(x => x == 2) // 1
[1, 2, 3, 4, 5].copyWithin(3, 0) // [1, 2, 3, 1, 2]
["a", "b", "c"].entries() // iterator [0, "a"], [1,"b"], [2,"c"]
["a", "b", "c"].keys() // iterator 0, 1, 2
["a", "b", "c"].values() // iterator "a", "b", "c"
Старый 12.10.2015 17:04 Anton Riot вне форума
Anton Riot
Глобальные функции. Анонимные функции. Паровозы из нечеловекочитаемых методов.
Кошмар какой-то.
 
Последние записи от kemsky

 


Часовой пояс GMT +4, время: 21:55.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.