No, lamentablemente no viene por defecto con ningun Delphi. Pero es de codigo abierto y esta disponible para Delphi a partir de la version 2010 si no me equivoco.
Aporta un monton de cosas, tantas que apenas estoy rascando la superficie. La parte que uso siempre es su biblioteca de colecciones.
Las colecciones de Spring son mas versatiles que las de Delphi porque todas implementan una interface IEnumerable<T> (que no es la que viene en la RTL) que tiene metodos para soportar operaciones tipo LINQ, por ejemplo:
program Project1;
{$APPTYPE CONSOLE}
uses
Spring,
Spring.Collections,
SysUtils;
procedure PrintAction(const Each: Integer);
begin
Writeln(IntToStr(Each));
end;
// Spring.TPredicate<T> = reference to function (const Arg1: T): Boolean;
function GreaterThan(const AValue: Integer): Spring.TPredicate<Integer>;
begin
Result := function(const Each: Integer): Boolean
begin
Result := Each >= AValue;
end;
end;
var
Lista, OtraLista: IList<Integer>;
Elementos: IEnumerable<Integer>;
begin
// TCollections es una clase estatica que es es la fabrica de colecciones. Ella se encarga de crear la clase
// que haga falta y devulve la interface
Lista := TCollections.CreateList<Integer>;
// agregar datos
Lista.Add(10);
Lista.Add(15);
Lista.AddRange([5, 32, 45]);
// el metodo for each que ejecuta una "accion" para cada elemento
Writeln('Lista.ForEach');
Lista.ForEach(
procedure(const Each: Integer)
begin
Writeln(IntToStr(Each));
end);
Writeln;
// el metodo IEnumerable.Where, recibe como parametro un predicado y devuelve otro IEnumerable
// un predicado es una funcion que devuelve un Boolean y se evalua por cada elemento de la coleccion
// si evalua a True, ese elemento se encuentra en el resultado, si devuelve False no
// por ejemplo, para obtener la coleccion de elementos mayores o iguales que 20:
Elementos := Lista.Where(
function(const Each: Integer): Boolean
begin
Result := Each >= 20;
end);
// puedo definir "aparte" la accion a ejecutar. Por ejemplo en un procedimiento "suelto", recibirlo por parametro
// y luego enviarselo al .ForEach. Mismo caso para el .Where
// imprimamos en pantalla esta nueva coleccion..
Writeln('Elementos.ForEach(PrintAction)');
Elementos.ForEach(PrintAction);
Writeln;
// o tambien puedo encadenar operaciones, asi
Writeln('Lista.Where(GreaterThan(20)).ForEach(PrintAction)');
Lista.Where(GreaterThan(20)).ForEach(PrintAction);
Writeln;
Writeln('Lista.Max: ' + IntToStr(Lista.Max));
Writeln('Lista.Min: ' + IntToStr(Lista.Min));
Writeln('Lista.First: ' + IntToStr(Lista.First));
Writeln('Lista.Last: ' + IntToStr(Lista.Last));
Writeln;
// creo otra lista, en este caso le paso un arreglo con valores
OtraLista := TCollections.CreateList<Integer>([70, 75, 80]);
// concatenacion de listas:
Writeln('Lista.Concat(OtraLista).ForEach(PrintAction)');
Lista.Concat(OtraLista).ForEach(PrintAction);
Writeln;
Readln;
end.
Y hay un monton de metodos mas: para ordenar (orden "comun" e inverso),
Skip(n) devuelve un una coleccion salteando los n primeros elementos,
SkipWhile(predicado) devuelve una coleccion salteando elementos mientras se cumpla el predicado,
TakeWhile(predicado) devuelve una coleccion con los elementos que satisfacen el predicado, cuando encuentra uno que no satisface, deja de agregar al resultado
Any(predicado) devuelve True si al menos un elemento satisface el predicado, False en caso contrario
All(predicado) idem anterior pero en vez de uno, todos deben satisfacerlo
Contains(T) devuelve True si el elemento existe en la coleccion, false en caso contrario
A su vez, los metodos First, Last, Max, Min, y similares, poseen versiones sobrecargadas que permiten pasar comparadores proprios, o en el caso de First y Last, un predicado (dame el primer elemento que satisface el predicado)
Estas colecciones me recuerdan mucho a las de Smalltalk por ejemplo
Hay un monton de clases de colecciones implementadas: Listas, Listas Enlazadas, Colas, Pilas, Conjuntos, Mapas, Diccionarios,
Luego hay un Dependency Injection Container, que si no me equivoco es "lo mas famoso" o usado del framework. No lo he estudiado a fondo, pero estos contenedores lo que hacen es resolver las dependencias entre los objetos: basicamente conectan todas las clases/interfaces para que todo funcione
Hay una biblioteca criptografica; un ORM (Marshmallow, en el branch de pruebas), bibliotecas de reflexion, biblioteca para programacion orientada a aspectos (un interceptor, aspectos implementados como diversos loggers), utilidades para: :WinApi, SysUtils, IO.. tambien hay una implementacion de eventos multi-cast, nullables (NullableInteger, NullabeString, NullableDateTime, Nullable<T>.. etc). Luego hay un framework para MVC, del mismo autor, llamado DSharp que se espera que pronto se haga el merge en Spring
En fin, hay un monton de cosas implementadas y yo creo que es un paquete que deberia estar en cualquier entorno Delphi instalado
Editado por Agustin Ortu, 02 julio 2016 - 07:19 .