Imaginá esto:
repoPersona
.filter(p -> p.getEdad() > 50)
.toList();
Y que mágicamente se transforme en:
SELECT * FROM persona WHERE edad > 50;
Sería hermoso.
Pero… ¿no son lazy los streams?
Sí, los streams en Java son lazy:
users.stream()
.filter(u -> u.getAge() > 50)
.toList();
No se ejecuta hasta el final
Peeeero...
Lazy no es lo mismo que interpretable
En Java, esto:
u -> u.getAge() > 50
Se compila a bytecode
No queda como estructura accesible
Es decir:
- No podés analizarla
- No podés transformarla
- No podés convertirla en SQL
¿Por qué en C# sí se puede?
En .NET LINQ pasa algo distinto:
repo.Where(x => x.Age > 50)
Eso no es una función normal
Es: Expression<Func<T, bool>>
El código es datos (un AST)
Por esta razón necesitamos de cosas como Specification de jpa para tipar nuestras querys :(
Java Streams no pueden ser LINQ porque: Java no puede “leer” lambdas como datos
Y eso obliga a usar soluciones como Specifications.

No hay comentarios.:
Publicar un comentario