JAVA 9 – Les streams et leurs équivalents en SQL

Avatar

Si comme moi vous connaissez le Java de la vieille école et que vous n’êtes pas encore expert avec les changements de la version 8,
je vous propose de voir ensemble les avantages de la librairie des Stream.
Les stream permettent de parcourir, filtrer, manipuler et transformer des données. Un peu comme avec SQL.

Dans cette article, je vais faire le parallèle entre les utilisations des stream et leurs équivalents SQL.

C’est parti !

Dans nos exemples nous utiliserons une liste contenant des données sur des personnes.
Elle contient des informations sur leurs poids, leurs tailles, etc.
tableSQL
listeJava

1. Parcourir les données

On commence par la base, comment parcourir et afficher les données :
En Java :
Stream<Personne> sp = listeJava.stream();
sp.forEach(System.out::println);

! en Java, une fois le stream parcouru il est détruit. Il faudra le recréer pour afficher la liste à nouveau.

En SQL on ferait le classique :
SELECT * FROM tableSQL

2. Filtrer les données

Imaginons qu’on veuille filtrer les personnes de plus de 50 kg.
En Java :
sp = listeJava.stream();
sp.filter(x -> x.getPoids() > 50)
.forEach(System.out::println);

En SQL :
SELECT * FROM tableSQL WHERE poids > 50

3. L’opérateur Map

L’operation map en Java permet de récupérer uniquement ce dont on a besoin :
Dans notre cas on veut seulement afficher le poids.
sp = listeJava.stream();
sp.filter(x -> x.getPoids() > 50)
.map(x -> x.getPoids())
.forEach(System.out::println);

En SQL, il suffit de mentionner la colonne dans le SELECT :
SELECT poids FROM tableSQL WHERE poids > 50

4. Compter les données

Sans surprise, on utilise l’opérateur Count.
En Java :
sp = listeJava.stream();
long count = sp.filter(x -> x.getPoids() > 50)
.map(x -> x.getPoids())
.count();

En SQL :
SELECT COUNT(*) FROM tableSQL WHERE poids > 50

5. Sommer des résultats

Et si nous avions besoin de sommer les poids des personnes de plus de 50 kg ?

En Java il faut utiliser l’opérateur Reduce:

sp = listeJava.stream();
Double sum = sp.filter(x -> x.getPoids() > 50)
.map(x -> x.getPoids())
.reduce(0.0d, (x,y) -> x+y);
System.out.println(sum);

En SQL c’est l’opérateur SUM :
SELECT SUM(poids) FROM tableSQL WHERE poids > 50

6. Créer une nouvelle banque de donnés

L’opérateur Collect permet de créer une nouvelle liste en Java :
sp = listeJava.stream();
List<Double> ld = sp.filter(x -> x.getPoids() > 50)
.map(x -> x.getPoids())
.collect(Collectors.toList());
System.out.println(ld);

L’équivalent SQL est la fonction CREATE TABLE. C’est une fonction plus compliquée qui demande le détail de chaque colonne et type de donnée,
je ne vais pas la détailler ici.

Voila c’est déjà terminé !
Nous avons pu voir la puissance des stream rien que sur les fonctions de base,
et réviser notre SQL par la même occasion 😉

Pour aller plus loin, je vous donne rendez-vous sur open classroom :
https://openclassrooms.com/fr/courses/26832-apprenez-a-programmer-en-java/5013326-manipulez-vos-donnees-avec-les-streams

Facebooktwittergoogle_plusmail

Tech-talk en partenariat avec Tredzone : Modèle Actor, Programmation adaptée aux CPUs multi-core

Laura NATAF
TREDZONE X OSSIA
Jeudi dernier, Ossia Conseil et Tredzone ont invité plusieurs consultants et intervenants à venir échanger lors d’un Tech-Talk : « Modèle Actor, Programmation adaptée aux CPUs multi-core »
image.png
Pour rappel, TREDZONE est une Start-Up qui a développé le projet open-source SimplX, framework réactif dédié à la programmation parallèle sur une architecture multi-core.
SimplX est destiné aux systèmes critiques : matching d’ordres, connectivité de marché, traitement massif de données et systèmes complexes à performance prédictible.
Facebooktwittergoogle_plusmail

Chat Live Ossia Conseil par JobTeaser

Laura NATAF

Jobteaser X ossia

La semaine dernière, nos deux consultants Yusuf et Laurent, ont répondu à toutes vos questions lors du chat live @JobTeaser ! Le sujet : recruter des développeurs juniors en Java et .Net

A revoir en cliquant sur ce lien ci-dessous

https://www.jobteaser.com/fr/companies/ossia-conseil/newsfeed/recruitment-24622?fbclid=IwAR1vwa5CJMbOcnrPNjyCz9TpzZ6Y2iMefEzW8u_yhL2ghL13MHAZkyPoYL0

 

Facebooktwittergoogle_plusmail

Apprendre la programmation RxJS, avec Hackages

Laura NATAF

Hello à tous,

Nous allons passer la soirée à travailler avec RxJS. Nous proposons une session de HackJam sur la programmation réactive avec RxJS et nous avons invité Hackages et tous les intervenants à venir interagir au sein de nos locaux.

 

RxJS

Facebooktwittergoogle_plusmail

La Ossia Team à la #ColorRun by Sephora

Laura NATAF

#newsossia

La Team Ossia était présente ce dimanche dernier à la #ColorRun by SEPHORA !

Bravo à tous les « runers », vous nous avez rempli de couleur et de bonne humeur ! Cette première expérience fut un franc succès et a permis de prouver que l’esprit d’équipe était bien au rendez-vous :)

A l’année prochaine, et en attendant on vous prépare bien d’autres surprises !

WhatsApp Image 2018-04-15 at 21.27.58 WhatsApp Image 2018-04-15 at 21.27.57 WhatsApp Image 2018-04-15 at 21.27.56 (1) - copie WhatsApp Image 2018-04-15 at 21.31.27 - copie

Facebooktwittergoogle_plusmail

Youssef à la rencontre des giraffes

Laura NATAF

Nos consultants autour du monde… Quoi de mieux que des petites photos pour nous faire partager leurs voyages ?

Du côté de Youssef, la rencontre des giraffes a été une expérience exceptionnelle.

Merci de nous l’avoir faite partagée :)

 

image2 image1

 

 

Facebooktwittergoogle_plusmail

Les nouveautés Microsoft C# 7.0

Jerome

Cette nouvelle version Microsoft de C# accompagne la sortie Visual Studio 2017. Les changements semblent minimes comparé au C#6.0 mais cette version améliore l’écriture du code et les performances.

Les nouvelles fonctionnalités au langage sont :

1.    Variables out

La syntaxe existante qui prend en charge les paramètres out a été améliorée dans cette version. Il n’est plus nécessaire de déclarer la variable en amont. :

Avant:

int numericResult;

if (int.TryParse(input, out numericResult))

WriteLine(numericResult);

Après:

if (int.TryParse(input, out int result))

WriteLine(result).

2.    Tuples

Il est désormais possible de créer des types légers et sans noms qui contiennent plusieurs champs publics sans avoir à utiliser les structures de données suivantes :

  • un tableau ou une liste ;
  • des paramètres out ;
  • la classe Tuple<…> existe depuis C# 4.0 ;
  • une classe spécifique pour représenter les résultats de la fonction.

Voici un exemple ecrit en C# 6.0:

public void Main()

{

var customer = GetCustomer();

int id = customer.Item1;

string firstname = customer.Item2;

string lastname = customer.Item3;

}

private Tuple<int, string, string> GetCustomer()

{

return new Tuple<int, string,= » » string= » »>(1, « John », « Doe »);

}

Avec C# 7.0, la méthode GetCustomer() devient:

private (int, string, string) GetCustomer()

{

return (1, « John », « Doe »);

}

Au lieu d’utiliser .Item1, .Item2 nous pouvons nommer les propriétés du tuple:

public void Main()

{

var customer = GetCustomer2();

int id = customer.Id;

string firstname = customer. Firstname;

string lastname = customer. Lastname;

}

private (int Id, string Firstname, string Lastname) GetCustomer2()

{

return (1, « John », « Doe »);

}

en décomposant le tuple directement en variables nous obtenons:

var (id, firstname, lastname) = GetCustomer();

 Par exemple, pour échanger les valeurs de deux variables, l’écriture devient triviale car nous n’avons plus besoin de variables intermédiaires :

(x, y) = (y, x).

3.    Éléments ignorés

Par exemple lors de la déconstruction d’un tuple, seul les variables nommées seront assignées:

var (_, _, _, pop1, _, pop2) = QueryCityDataForYears(« New York City », 1960, 2010).

4.    Critères spéciaux

L’expression is étend l’opérateur is classique pour interroger un objet au-delà de son type. Dans notre exemple nous utilisons le « switch » mais fonctionne également avec le « if statement » :

public static int DiceSum(IEnumerable <object> values}

{

var sum = 0;

foreach (var item in values)

{

switch (item)

{

case 0:

break;

case int val:

sum += val;

break;

case IEnumerable<object> subList when subList.Any():

sum += DiceSum(subList);

break;

case IEnumerable<object> subList:

break;

case null:

break;

default:

throw new InvalidOperationException(« unknown item type »);

}

return sum;

}

5.    Variables locales et retours ref

Les arguments et les variables locales de méthode peuvent être des références à un autre stockage.

public static ref int Find(int[,] matrix, Func<int, bool= » »> predicate)

{

for (int i = 0; i < matrix.GetLength(0); i++)

for (int j = 0; j < matrix.GetLength(1); j++)

if (predicate(matrix[i, j]))

return ref matrix[i, j];

throw new InvalidOperationException(« Not found »);

}

Maintenant que la méthode retourne une référence à la valeur entière dans la matrice, vous devez modifier l’emplacement où elle est appelée. La déclaration var signifie que valItem est une référence vers un int :

var valItem = MatrixSearch.Find3(matrix, (val) => val == 42);

Console.WriteLine(valItem);

valItem = 24;

Console.WriteLine(matrix[4, 2]).

6.    Fonctions locales

Les fonctions locales permettent de déclarer des méthodes à l’intérieur d’une autre méthode. Il existe deux cas d’utilisation très courants pour les fonctions locales : les méthodes iterator publiques et les méthodes async publiques.

public static IEnumerable AlphabetSubset(char start, char end)

{

if (end <= start)

throw new ArgumentException($ »{nameof(end)} must be greater than {nameof(start)} »);

return alphabetSubsetImplementation();

IEnumerable<char> alphabetSubsetImplementation()

{

for (var c = start; c < end; c++)

yield return c;

}

}

public Task<string> PerformLongRunningWork(string address, int index, string name)

{

return longRunningWorkImplementation();

async Task<string> longRunningWorkImplementation()

{

var interimResult = await FirstWork(address);

var secondResult = await SecondStep(index, name);

return $ »The results are {interimResult} and {secondResult}. Enjoy. »;

}

}

7.    Autres membres expression-bodied

C# 6 a introduit les membres expression-bodied pour les fonctions membres, ainsi que des propriétés en lecture seule.

C#7 développe les membres autorisés pouvant être implémentés comme expressions. C’est-à-dire implémenter des constructeurs, des finaliseurs ainsi que des accesseurs get et set sur des propriétés et des indexeurs.

// Expression-bodied constructor

public ExpressionMembersExample(string label) => this.Label = label;

// Expression-bodied finalizer

~ExpressionMembersExample() => Console.Error.WriteLine(« Finalized! »);

private string label;

// Expression-bodied get / set accessors.

public string Label

{

get => label;

set => this.label = value ?? « Default label »;

}

8.    Expressions throw

Cette version permet de lever des exceptions dans les constructions de code qui n’étaient pas autorisées auparavant, car throw était une instruction.

public string Name

{

get => name;

set => name = value ??

throw new ArgumentNullException(paramName: nameof(value), message: « New name must not be null »);

}

Cette fonctionnalité permet d’utiliser des expressions throw dans des expressions d’initialisation :

private ConfigResource loadedConfig = LoadConfigResourceOrDefault() ??

throw new InvalidOperationException(« Could not load config »);

Auparavant, ces initialisations devaient se trouver dans un constructeur, avec les instructions throw dans le corps du constructeur :

public ApplicationOptions()

{

loadedConfig = LoadConfigResourceOrDefault();

if (loadedConfig == null)

throw new InvalidOperationException(« Could not load config »);

}

9.    Types de retour async généralisés

Les méthodes déclarées avec le modificateur async peuvent retourner d’autres types en plus de Task et de Task<T>.

public ValueTask<int> CachedFunc()

{

return (cache) ? new ValueTask(cacheResult) : new ValueTask(LoadCache());

}

private bool cache = false;

private int cacheResult;

private async Task LoadCache()

{

// simulate async work:

await Task.Delay(100);

cacheResult = 100;

cache = true;

return cacheResult;

}

10.    Améliorations de la syntaxe littérale numérique

De nouveaux jetons améliorent la lisibilité des constantes numériques. Le séparateur de chiffres peut apparaître n’importe où dans la constante. Pour les nombres de base 10, il arrive fréquemment qu’il soit utilisé comme séparateur des milliers. Il est possible d’utiliser le séparateur de chiffres également avec les types decimal, float et double :

public const long BillionsAndBillions = 100_000_000_000;

public const double AvogadroConstant = 6.022_140_857_747_474e23;

public const decimal GoldenRatio = 1.618_033_988_749_894_848_204_586_834_365_638_117_720_309_179M.

Facebooktwittergoogle_plusmail

Les évolutions de la réglementation MIFID : MIFID 2

Cédric Berthelot

Comme tous les ans, la nouvelle année amène la mise en place de nouvelles réglementations.

Préparée depuis longtemps, vaguement terminée ou oubliée dans un placard pendant 7 ans, le 3 janvier 2018 était le premier jour de la réglementation MIFID 2.

MIFID : Ouvrir la concurrence et renforcer la réglementation

En 2007, MIFID (Markets In Financial Instruments Directive) faisait ses grands débuts. La Commission européenne espérait libérer la concurrence, protéger les clients et surtout harmoniser la réglementation des marchés financiers dans l’Union Européenne.

Les principales évolutions furent d’ouvrir les places d’exécution des instruments listés, qui étaient alors la chasse gardée des bourses de valeur, et la permission pour les entreprises d’offrir plus de services d’investissement en Europe une fois l’autorisation accordée dans leur pays d’origine.

Du côté client, l’objectif était de protéger les plus vulnérables et de rendre plus transparents les processus d’exécutions tout en fournissant un service de Best Execution propre à chaque client. Le Best Exec signifie que le client est celui qui décide des paramètres optimaux de l’exécution demandée. S’il demande à privilégier la vitesse au prix alors l’entreprise doit respecter ce choix et agir en priorisant la vitesse.

A peine mise en place, la directive MIFID a eu le droit de se tester face à une crise. Le résultat est connu, un nouvel ennemi a été identifié, les produits dérivés, et MIFID 2 apparait pour compléter le travail de son ainé. Les objectifs sont toujours les mêmes, protéger les clients et offrir plus de transparence sur les marchés mais en élargissant grandement le périmètre.

Après la crise, MIFID 2 contre-attaque

Afin de protéger le client, chaque produit financier créé par une entité soumise aux règles européennes se doit de définir en détail son produit ainsi que les clients ciblés. Même chose pour les distributeurs qui se doivent de proposer à leur clientèle uniquement des produits adaptés. Si le créateur du produit n’est pas soumis aux directives MIFID, toutes ses tâches reviennent au distributeur. Le ciblage des clients concerne bien entendu ceux pouvant souscrire en comprenant le risque et les coûts engendrés, mais aussi les clients négatifs, ceux auxquels un produit ne doit pas être vendu. La politique de Best Execution devra aussi être transparente et comprise par le client.

Toujours dans une optique de transparence envers le client, les frais et commissions de chaque transaction devront être détaillés. Un effort particulier est demandé pour les frais de recherches qui, désormais, doivent être facturés aux gérants d’actifs. Auparavant ils étaient considérés comme implicitement inclus dans les frais d’exécutions d’ordre. Désormais c’est un nouveau coût à gérer pour les sociétés de gestion qui devront choisir entre absorber une nouvelle dépense ou la répercuter auprès de leurs clients (et le détailler dans la facturation bien entendu).

Plus proche de notre quotidien au travail, les transactions sont désormais soumises à une série de règles contraignantes aussi bien en pre-trade qu’en post-trade. Les prix négociés, ainsi que la quantité et le prix des transactions exécutées, devront être publiés à la milliseconde près. Le but est d’offrir à tous les clients la possibilité de bénéficier du même prix et ainsi éviter les préférences entre entités. Ces règles s’appliquent aux actions, obligations mais aussi aux produits dérivés et structurés.

Pour suivre au mieux les nouvelles règles, les marchés réglementés sur lesquels des transactions concernant des dérivés transitent offriront à chaque contrepartie un identifiant de transaction qui devra être conservé et présent dans les reportings réalisés auprès des instances de contrôles européennes.

Des OTC mais listés ?

L’un des principaux problèmes de MIFID concerne les reportings des OTC. Ces produits étant par définition non listés, ils sont difficiles à identifier dans le flot de transactions. Pour pallier ce problème ceux-ci seront désormais affublés de codes ISIN. Tout comme pour les produits listés, ces codes seront uniques. Cependant, tous les OTC ne sont pas concernés, seuls ceux ayant au moins un sous-jacent échangeable sur une plateforme de négociation européenne se doit d’avoir un ISIN.

Dans les faits cela signifie que dans le cas où vous vendez un panier de produits contenant une action échangeable sur n’importe quel marché européen, vous devez demander la création d’un ISIN au DSB (Derivatives Service Bureau) de ANNA, l’agence en charge de la création des ISIN. Autre exemple, si vous avez une option sur un Indice, qui contient lui-même un produit échangeable, une demande d’ISIN est nécessaire. Le changement d’un sous-jacent, d’une caractéristique principale du produit, comme une date de maturité, entrainent une mise à jour de l’identifiant.

Si l’idée de vouloir identifier plus facilement les OTC est légitime, elle se confronte à de nombreux heurts. Avec des produits complexes il est difficile d’identifier lorsque la composition d’un sous-jacent change et donc de faire évoluer l’ISIN en conséquence. De même, reporter et suivre un produit dont le code peut changer dans la journée peut rapidement devenir un défi.

MIFID 2 est l’une des dernières réglementations issue de la crise de 2007 à entrer en vigueur. Il reste encore quelques mois aux sociétés pour régler les derniers détails sur certains sujets. Après, cela ce ne sera pas encore le temps de se reposer puisque FRTB (Fundamental Review of the Trading Book), surnommée Bâle IV, est prévue pour une entrée en vigueur en janvier 2019.

Facebooktwittergoogle_plusmail