Milou fait un régime
Guava - Lombok
SPONSORS
@thierryleriche

Thierry Leriche-Dessirier




icauda.com

Consultant JEE freelance
Professeur de Génie Logiciel à l’E...
Cours

Forums

FAQ

News

Interviews

Critiques

Articles / tutoriels

Agendas

Magazine
13 OOO OOO pages vues par mois
5 500 000 visites par mois
2 500 000 visites uniques par mois
5 000 messages forum par jour
Agenda

 Milou est trop lourd (intro)

 Lombok (et Lombok-pg) en action
 Tour d’horizon de Guava
Milou est trop lourd (et doit faire un régime)

I am Milou
DOG

public class Dog {

private
private
private
private
private
private
private
private
private
private
...

Integer
Stri...

















id
name
fullName
sex
birthday
race
lof
weight
size
Colors

Constructeurs
Getters / setter...

















id
name
fullName
sex
birthday
race
lof
weight
size
Colors

clic clic
démo

Constructeurs
...
public class Dog
implements Comparable<Dog> {
...

@Override
public int compareTo(Dog other) {
int result = 0;
result = na...







Constructeurs
Getters / setters
toString ()
equals ()
hashCode ()
compareTo ()

10 attributs








...
Java

10 attributs
210 lignes de code
Va chercher Guava 






toString ()
equals ()
hashCode ()
compareTo ()

Commons  FAQ 1-2
Base

Objects
Java 5

public String toString() {
return "Dog [id=" + id
+ ", name=" + name
+ ", fullName=" + fullName
+ ", sex=" + sex
+...
Java 5

public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(Dog.class.getSimpleName())
.append("[...
Guava

public String toString() {
return Objects.toStringHelper(this)
.add("id", id)
.add("name", name)
.add("fullName", f...
Java 5

birthday, fullname, name, race et sex
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj ==...
Guava

birthday, fullname, name, race et sex

public boolean equals(Object obj) {
if (!(obj instanceof Dog)) return false;...
Java 5

birthday, fullname, name, race et sex
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime...
Guava

birthday, fullname, name, race et sex

public int hashCode() {

return Objects.hashCode(birthday, fullName,
name, r...
Java 5

name, fullname, birthday, weight, size, race et sex
public int compareTo(Dog other) {
int result = 0;
result = nam...
name.compareTo(other.name)

Vs

other.name.compareTo(name)

 compareTo ()
name, fullname, birthday, weight, size, race et sex
public int compareTo(Dog other) {
return ComparisonChain.start()
.comp...
Lombok

en action
Régime

Annotations de base
Régime

 @NoArgsConstructor /
@RequiredArgsConstructor /
@AllArgsConstructor  constructeurs
 @Getter / @Setter
 @ToStr...
Régime
clic clic
démo

 @NoArgsConstructor /
@RequiredArgsConstructor /
@AllArgsConstructor
 @Getter / @Setter
 @ToStri...
Java
Lombok

10 attributs
210 lignes de code
12 lignes + 2-3 @ + compareTo()
Factory

@RequiredArgsConstructor(staticName = "of")
public class Dog {
private Integer id;
@NonNull private String name; ...
Factory

@RequiredArgsConstructor(staticName = "of")
public class Dog {
private Integer id;
@NonNull private String name; ...
Trucs pratiques

Se simplifier la vie
Pratique







@Cleanup
@Synchronized
@SneakyThrows
@Log
@Delegate

 val
Ressources

public void lireJava6(String from) {
InputStream in = null;
try {
in = new FileInputStream(from);
byte[] b = n...
Ressources

public void lire(String from) throws IOException {

}

@Cleanup
InputStream in = new FileInputStream(from);
by...
Délombok

Revenir sans la lib
Délombok

java -jar lombok.jar delombok src -d src-delomboked
<properties>
<lombok.sourceDirectory>
${project.basedir}/src...
Délombok

5

@Data
public class Dog {
private Integer id;
public class Dog {
private String name;
private Integer id;
priv...
Lombok-pg

Annotations supplémentaires
Annotations Pg


















 @Builder
@Action
 @LazyGetter
@Function
 @FluentSetter
@EnumId
 @Pre...
Fluent

@FluentSetter
@Getter
public class Dog {
private Integer id ;
private String name ;
private String fullName ;
...
...
Builder

@Builder
@Getter
public class Dog {
private Integer id ;
private String name ;
private String fullName ;
...

 D...
extension

L

@ExtensionMethod({ Dog.class, MyDogExtensionClass.class })
public class DogWithExtension {
public void foo()...
Lombok or not Lombok ?

Avantages et inconvénients
Pro / Cons






Byte code modifié 
Version en 0.x
Documentation des prog ?
Magique ?






Compacité
Lecture sim...
Guava

tour d’horizon
Factory Methods

Les choses que j’aime
Java 5

< new Vs static factories >
List<Integer> primeNumbers = new ArrayList<Integer>();
Set<String> colors = new TreeSe...
< new Vs static factories >

Java 5

5

List<Integer> primeNumbers = new ArrayList<Integer>();
Set<String> colors = new Tr...
Java 5

< new Vs static factories >
List<Integer> primeNumbers = new ArrayList<Integer>();
Set<String> colors = new TreeSe...
Java 5

< new Vs static factories >
List<Integer> primeNumbers = new ArrayList<Integer>();
Set<String> colors = new TreeSe...
Java 5

< new Vs static factories >
List<Integer> primeNumbers = new ArrayList<Integer>();
Set<String> colors = new TreeSe...
List of dogs

< new Vs static factories >

List<Dog> dogs = newArrayList(
new Dog("Milou", 12.5, MALE, ...),
new Dog("Rint...
Immutables

Pour que ça ne change pas
immutable

Quand ?
immutable

Quand ?
mutable

On se demande souvent si une liste doit être immutable mais
c’est prendre le problème dans le ...
Java 5

< unmodifiables Vs immutables >
Set<Integer> temp =
new LinkedHashSet<Integer>(Arrays.asList(1, 2, 3, 5, 7));
Set<...
Java 5

< unmodifiables Vs immutables >
Set<Integer> temp =
new LinkedHashSet<Integer>(Arrays.asList(1, 2, 3, 5, 7));

Gua...
Of

< unmodifiables Vs immutables >
ImmutableSet.of(E
ImmutableSet.of(E
ImmutableSet.of(E
ImmutableSet.of(E
ImmutableSet.o...
Java 5

< Copie de défense >
public class Dog {
private String name;
...
private List<String> colors;
public Dog(String na...
Guava

< Copie de défense >
public class Dog {
private String name;
...
private ImmutableList<String> colors;
public Dog(S...
Collections en plus

Multimap, Bipap, Multiset
Java 5

< Multi Map >
Map<String, List<String>> dogFavoriteColors =
new HashMap<String, List<String>>();

5
5

List<String...
Java 5

< Multi Map >
Map<String, List<String>> dogFavoriteColors =
new HashMap<String, List<String>>();

5
5

Guava

List...
Guava

< Bi Map >
BiMap<String, Dog> tatouages = HashBiMap.create();

tatouages.put("ABC123", new Dog("Milou") );
tatouage...
Guava

< Multi Set >
Multiset<Integer> ages = HashMultiset.create();

ages.add(2);
ages.add(3);
ages.add(7);
ages.add(11);...
Base

Préconditions, joiner, splitter, optional





toString ()
equals ()
hashCode ()
compareTo ()
DOG

< Preconditions >
public class Dog {
private Integer
private String
private String
...

id ;
name ;
fullName ;

publi...
DOG

< Preconditions >
import static com.google.common.base.Preconditions.*;

public class Dog {
private Integer
private S...
Joiner

String names = Joiner.on(", ")
.join(newArrayList("Lassie", "Volt", "Milou"));

"Lassie, Volt, Milou"

G

Java cla...
Joiner

String names = Joiner.on(", ")
.join(newArrayList("Lassie", "Volt", "Milou"));

"Lassie, Volt, Milou"

G

String n...
Joiner

String names = Joiner.on(", ")
.join(newArrayList("Lassie", "Volt", "Milou"));

"Lassie, Volt, Milou"

G

String n...
Joiner

String names = Joiner.on(", ")
.join(newArrayList("Lassie", "Volt", "Milou"));

"Lassie, Volt, Milou"

G

String n...
Splitter

Iterable<String> dogNames =
Splitter.on(",")
.split("Lassie, Volt, Milou");

[ "Lassie",
"Volt",
"Milou" ]
Splitter

Iterable<String> dogNames =
Splitter.on(",")
.split("Lassie, Volt, Milou");

[ "Lassie",
"Volt",
"Milou" ]

Iter...
Splitter

Iterable<String> dogNames =
Splitter.on(",")
.split("Lassie, Volt, Milou");

[ "Lassie",
"Volt",
"Milou" ]

Iter...
Splitter

Iterable<String> dogNames =
Splitter.on(",")
.split("Lassie, Volt, Milou");

[ "Lassie",
"Volt",
"Milou" ]

Iter...
Optional

Wrapper Optional <T>
Dog dog = new Dog("Milou", ...);
Optional<Dog> opt = Optional.of(dog);
assertTrue( opt.isPr...
Optional

Wrapper Optional <T>
Dog dog = new Dog("Milou", ...);
Optional<Dog> opt = Optional.of(dog);
assertTrue( opt.isPr...
Optional

Wrapper Optional <T>
Dog dog = new Dog("Milou", ...);
Optional<Dog> opt = Optional.of(dog);
assertTrue( opt.isPr...
Optional

Wrapper Optional <T>
Dog dog = new Dog("Milou", ...);
Optional<Dog> opt = Optional.of(dog);
assertTrue( opt.isPr...
Functional Programming

todo
Super chien

Dog
Super Chien

public class SuperChien implements SuperHero {
private
private
private
private

String
double
Set<String>
Set...
Transformation

< Transformation >
List<SuperChien> superChiens =
Lists.transform(dogs,
new Function<Dog, SuperChien>() {
...
Transformation

< Transformation >
List<SuperChien> superChiens =
Lists.transform(dogs, new Function<Dog, SuperChien>() {
...
< Filtre >

Filtre

G

Predicate<Dog> malePredicate =
new Predicate<Dog>() {
public boolean apply(Dog dog) {
return dog.ge...
Filtre

< Filtre >
Predicate<Dog> malePredicate =
new Predicate<Dog>() {
public boolean apply(Dog dog) {
return dog.getSex...
Filtre

< Filtre >
Predicate<Dog> malePredicate =
new Predicate<Dog>() {
public boolean apply(Dog dog) {
return dog.getSex...
Seconde liste

List<Dog> dogs2 = newArrayList(
new Dog("Rintintin", 45.0, MALE, ...),
new Dog("Pluto", 22.0, MALE, ...),
n...
Pas fluent

< Fluent or not fluent ? >
Predicate<Dog> malePredicate =
new Predicate<Dog>() {
public boolean apply(Dog dog)...
Pas fluent

< Fluent or not fluent ? >

Iterable<FullDog> maleDogs =
Iterables.filter(dogs, malePredicate);

Fluent

Itera...
Cache

todo
Web Service

< Memoization >

public class DogService {
@Inject
private PetShopWebService service;
public Integer getNumbe...
Web Service

< Memoization >

Cache manuel

public class DogService {
@Inject
private PetShopWebService service;
public In...
Guava

< Memoization >

public class DogService {
@Inject
private PetShopWebService service;
private Supplier<Integer> nbO...
Guava

< Memoization >

public class DogService {
@Inject
private PetShopWebService service;
private Supplier<Integer> nbO...
Web Service

< Cache >

public class DogService {
@Inject
private PetShopWebService service;
private Map<String, Dog> dogM...
Guava

< Cache >

public class DogService {
@Inject
private PetShopWebService service;

G

private LoadingCache<String, Do...
Hash

Fantôme
Hash

HashFunction hf = Hashing.md5();
HashCode hc = hf.newHasher()
.putInt(123)
.putString("Milou")
.hash();
byte[] bytes...
Préparation

< Is in list ? >

int NB_OF_DOGS = 100000;

contains

List<Dog> dogs = newArrayList();
Random rand = new Rand...
Bloom filter

< Is in list ? >
Funnel<Dog> dogFunnel = new Funnel<Dog>() {
public void funnel(Dogdog, PrimitiveSink sink) ...
Guava or not Guava ?

Avantages et inconvénients
Pro / Cons

 Ne pas en abuser…

 Utile
 Bonnes pratiques
LIENS

@thierryleriche
Guava
 http://code.google.com/p/guava-libraries

Lombok
 http://projectlombok.org

Lombok-pg
 https://github.com/peichh...
ICAUDA
 http://icauda.com
 http://icauda.com/articles.html
 http://icauda.com/cours.html

(articles)
(slides)

Blog Gua...
MERCI
FAQ / Bonus

1. Guava Vs Commons
2. Régime façon Apache
3. Fonctionnal prog Vs boucle for
4. Créer des Maps
5. Charsets
6....
Guava Vs Commons ?

http://tinyurl.com/guava-vs-apache

1
toString

Régime : la méthode Commons ?
public String toString() {
return new ToStringBuilder(this)
.append("id", id)
.app...
equals

Régime : la méthode Commons ?
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) r...
hashCode

Régime : la méthode Commons ?
public int hashCode() {
return new HashCodeBuilder(17, 37)
.append(birthday)
.appe...
compareTo

Régime : la méthode Commons ?
public int compareTo(Dog other) {
return new CompareToBuilder()
.append(name, oth...
Transformation

Fonctionnal prog Vs boucle for : quand ?
List<SuperChien> superChiens = newArrayList(
Lists.transform(dogs...
of

Créer des Maps
public static final ImmutableMap<String, Integer>
AGES = ImmutableMap.of("Milou", 32,
"Volt", 7,
"Pluto...
Java 5

Charsets
String name = "Milou";

try {
byte[] bytes = name.getBytes("UTF-8");

5

} catch (UnsupportedEncodingExce...
Converter Spring
import org.springframework...Converter;

G

@Component("dogToChienConverter")
public class DogToChienConv...
Orderings

7
Licences
 Lombok :
 Lombok-pg :
 Guava :

Apache License 2.0

 Commons :

8

MIT License
MIT License

Apache License 2...
Extension avec valeurs
@ExtensionMethod({ Object.class, MyOtherClass.class })
public class DogWithExtension {
public void ...
Extension avec valeurs
@ExtensionMethod({ Object.class, MyOtherClass.class })
public class DogWithExtension {
public void ...
< Chrono >

Guava Java 5

long start = new Date().getTime();
foo(); // traitement long (ou pas)
long end = new Date().getT...
CharMatcher

11
Impl
public class Dog implements Comparable<Dog> {

private Integer id ;
private String name ;
private String fullName ;

...
Impl
@AutoGenMethodStub
public class Dog implements Comparable<Dog> {
private Integer id ;
private String name ;
private S...
And, or, in...

And, or, in…

G

import static com.google.common.base.Predicates.and;
import static com.google.common.base...
Partition
Limit

Partition, limit
List<List<FullDog>> partition =
Lists.partition(dogs, 4);

[Milou,
Rintintin,
Volt,
Lass...
Slides en préparation
I/O

todo
Ressources

< I/O >
public void lireJava6(String from) {
InputStream in = null;
try {
in = new FileInputStream(from);
byte...
Java 7

< I/O >
public void lireJava7(String from) {
try(InputStream in = new FileInputStream(from)) {
...
while (true) {
...
Guava

< I/O >
Todo

G
Concurrent / future

todo
Todo
Prochain SlideShare
Chargement dans…5
×

Guava et Lombok au Lorraine JUG

508 vues

Publié le

Guava est une librairie open source créée et maintenue par les équipes de Google. Inspirée des outils internes du géant, Guava propose de nombreux mécanismes (prog fonctionnelle) pour manipuler les collections, créer des caches customisés, faciliter la gestion de la concurrence et les IOs.

De son coté, Lombok est également un projet Open Source. Lombok et Lombok-pg simplifient
sensiblement l’écriture de code classique (builders, delegates, etc.) et des nombreuses méthodes purement techniques et indispensables (getters, setters, hashCode, equals, etc.) qui polluent nos objets.

Durant cette présentation, après un rapide constat de la verbosité de nos beans, nous feront un tour d’horizon de Lombok et Guava. Nous verrons comment ils nous aident à écrire du code concis et de qualité.

Plan de la présentation :
* Milou est trop lourd (intro) ;
* Lombok (et Lombok-pg) en action ;
* Tour d’horizon de Guava

Publié dans : Design
0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
508
Sur SlideShare
0
Issues des intégrations
0
Intégrations
9
Actions
Partages
0
Téléchargements
3
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Guava et Lombok au Lorraine JUG

  1. 1. Milou fait un régime Guava - Lombok
  2. 2. SPONSORS
  3. 3. @thierryleriche Thierry Leriche-Dessirier     icauda.com Consultant JEE freelance Professeur de Génie Logiciel à l’ESIEA Rédacteur pour Programmez Rédacteur pour Developpez.com
  4. 4. Cours Forums FAQ News Interviews Critiques Articles / tutoriels Agendas Magazine
  5. 5. 13 OOO OOO pages vues par mois 5 500 000 visites par mois 2 500 000 visites uniques par mois 5 000 messages forum par jour
  6. 6. Agenda  Milou est trop lourd (intro)  Lombok (et Lombok-pg) en action  Tour d’horizon de Guava
  7. 7. Milou est trop lourd (et doit faire un régime) I am Milou
  8. 8. DOG public class Dog { private private private private private private private private private private ... Integer String String SexeEnum Date String Boolean Double Double List<String> id ; name ; fullName ; sex ; birthday ; race ; lof ; weight ; size ; colors ; 5
  9. 9.                 id name fullName sex birthday race lof weight size Colors Constructeurs Getters / setters toString () equals () hashCode () compareTo ()
  10. 10.                 id name fullName sex birthday race lof weight size Colors clic clic démo Constructeurs Getters / setters toString () equals () hashCode () compareTo ()
  11. 11. public class Dog implements Comparable<Dog> { ... @Override public int compareTo(Dog other) { int result = 0; result = name.compareTo(other.name); if (result != 0) { return result; } ... } Code très limite… NPE ?...
  12. 12.       Constructeurs Getters / setters toString () equals () hashCode () compareTo () 10 attributs           id name fullName sex birthday race lof weight size Colors  210 lignes
  13. 13. Java 10 attributs 210 lignes de code
  14. 14. Va chercher Guava      toString () equals () hashCode () compareTo () Commons  FAQ 1-2
  15. 15. Base Objects
  16. 16. Java 5 public String toString() { return "Dog [id=" + id + ", name=" + name + ", fullName=" + fullName + ", sex=" + sex + ", birthday=" + birthday + ", race=" + race + ", lof=" + lof + ", weight=" + weight + ", size=" + size + ", colors=" + colors + "]"; } 5 Simple, efficace et bien pourri   toString ()
  17. 17. Java 5 public String toString() { StringBuilder sb = new StringBuilder(); sb.append(Dog.class.getSimpleName()) .append("[id=").append(id) .append(", name=").append(name) .append(", fullName=").append(fullName) ... .append(", colors=").append(colors); 5 return sb.toString(); } Mieux mais sans plus   toString ()
  18. 18. Guava public String toString() { return Objects.toStringHelper(this) .add("id", id) .add("name", name) .add("fullName", fullName) ... .add("colors", colors) .toString(); } G Builder  toString ()
  19. 19. Java 5 birthday, fullname, name, race et sex public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; 5 Dog other = (Dog) obj; if (birthday == null) { if (other.birthday != null) return false; } else if (!birthday.equals(other.birthday)) return false; if (fullName == null) { if (other.fullName != null) return false; ... } else if (!race.equals(other.race)) return false; if (sex != other.sex) return false; return true; } Carrément illisible   equals ()
  20. 20. Guava birthday, fullname, name, race et sex public boolean equals(Object obj) { if (!(obj instanceof Dog)) return false; Dog other = (Dog) obj; G return Objects.equal(birthday, other.birthday) && Objects.equal(fullname, other.fullname) && Objects.equal(name, other.name) && Objects.equal(race, other.race) && sex == other.sex; }  equals ()
  21. 21. Java 5 birthday, fullname, name, race et sex public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((birthday == null) ? 0 : birthday.hashCode()); result = prime * result + ((fullName == null) ? 0 : fullName.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((race == null) ? 0 : race.hashCode()); result = prime * result + ((sex == null) ? 0 : sex.hashCode()); return result; }  hashCode () 5
  22. 22. Guava birthday, fullname, name, race et sex public int hashCode() { return Objects.hashCode(birthday, fullName, name, race, sex); }  hasCode() G
  23. 23. Java 5 name, fullname, birthday, weight, size, race et sex public int compareTo(Dog other) { int result = 0; result = name.compareTo(other.name); if (result != 0) { return result; } result = fullname.compareTo(other.fullname); if (result != 0) { return result; } ... }  compareTo () 5
  24. 24. name.compareTo(other.name) Vs other.name.compareTo(name)  compareTo ()
  25. 25. name, fullname, birthday, weight, size, race et sex public int compareTo(Dog other) { return ComparisonChain.start() .compare(name, other.name) .compare(fullName, other.fullName) .compare(birthday, other.birthday) .compare(weight, other.weight) .compare(size, other.size) .compare(race, other.race) .compare(sex, other.sex) .result(); } Guava G  compareTo ()
  26. 26. Lombok en action
  27. 27. Régime Annotations de base
  28. 28. Régime  @NoArgsConstructor / @RequiredArgsConstructor / @AllArgsConstructor  constructeurs  @Getter / @Setter  @ToString  @EqualsAndHashCode  @Data  @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor
  29. 29. Régime clic clic démo  @NoArgsConstructor / @RequiredArgsConstructor / @AllArgsConstructor  @Getter / @Setter  @ToString  @EqualsAndHashCode  @Data
  30. 30. Java Lombok 10 attributs 210 lignes de code 12 lignes + 2-3 @ + compareTo()
  31. 31. Factory @RequiredArgsConstructor(staticName = "of") public class Dog { private Integer id; @NonNull private String name;  private String fullName; @NonNull private SexeEnum sex;  private Date birthday; ...  Dog dog = Dog.of("Milou", MALE); L name, sex
  32. 32. Factory @RequiredArgsConstructor(staticName = "of") public class Dog { private Integer id; @NonNull private String name;  private String fullName; @NonNull private SexeEnum sex;  private Date birthday; ...  Dog dog = Dog.of("Milou", MALE); L name, sex private Dog(@NonNull final String name, @NonNull final SexeEnum sex) { if (name == null) throw new NullPointerException("name"); if (sex == null) throw new NullPointerException("sex"); this.name = name; this.sex = sex; } public static Dog of(@NonNull final String name, @NonNull final SexeEnum sex) { return new Dog(name, sex); }
  33. 33. Trucs pratiques Se simplifier la vie
  34. 34. Pratique      @Cleanup @Synchronized @SneakyThrows @Log @Delegate  val
  35. 35. Ressources public void lireJava6(String from) { InputStream in = null; try { in = new FileInputStream(from); byte[] b = new byte[10000]; while (true) { int r = in.read(b); if (r == -1) break; ... } } catch (Exception e) { ... } finally { if (in != null) { try { in.close(); } catch (Exception e) { ... } } ... 5
  36. 36. Ressources public void lire(String from) throws IOException { } @Cleanup InputStream in = new FileInputStream(from); byte[] b = new byte[10000]; while (true) { int r = in.read(b); if (r == -1) break; ... } L
  37. 37. Délombok Revenir sans la lib
  38. 38. Délombok java -jar lombok.jar delombok src -d src-delomboked <properties> <lombok.sourceDirectory> ${project.basedir}/src/main/java </lombok.sourceDirectory> ... XML <build> <groupId>org.projectlombok</groupId> <artifactId>maven-lombok-plugin</artifactId> <executions> <execution> <phase>generate-sources</phase> </execution> </executions> ... mvn lombok:delombok
  39. 39. Délombok 5 @Data public class Dog { private Integer id; public class Dog { private String name; private Integer id; private String fullName; private String name; private SexeEnum sex; private String fullName; private Date birthday; ... private String race; private List<String> colors; private Boolean lof; private Double weight; public DogLombok() { private Double size; } private List<String> colors; @java.lang.Override } @java.lang.SuppressWarnings("all") public boolean equals(final java.lang.Obje if (o == this) return true; if (o == null) return false; mvn lombok:delombok if (o.getClass() != this.getClass()) ret final Dog other = (Dog)o; if (this.getId() == null ? other.getId() ... 5 @java.lang.Override @java.lang.SuppressWarnings("all") public int hashCode() { final int PRIME = 31; int result = 1; result = result * PRIME + (this.getId()
  40. 40. Lombok-pg Annotations supplémentaires
  41. 41. Annotations Pg                  @Builder @Action  @LazyGetter @Function  @FluentSetter @EnumId  @Predicate @Rethrow / @Rethrows @Singleton @AutoGenMethodStub @BoundPropertySupport / @BoundSetter @DoPrivileged @ExtensionMethod @ListenerSupport @WriteLock / @ReadLock @Await / @Signal / @AwaitBeforeAndSignalAfter @Sanitize.Normalize / .With @SwingInvokeLater / @SwingInvokeAndWait @Validate.NotEmpty / .NotNull / .With @VisibleForTesting
  42. 42. Fluent @FluentSetter @Getter public class Dog { private Integer id ; private String name ; private String fullName ; ...  DogLombok dog = new DogLombok(); dog.name("Milou").sex(MALE); println( dog.getName()); println( dog.getSex()); //  Milou //  MALE L
  43. 43. Builder @Builder @Getter public class Dog { private Integer id ; private String name ; private String fullName ; ...  Dog dog = Dog.dog().name("Milou").sex(MALE).build(); println( dog.getName()); println( dog.getSex()); //  Milou //  MALE L
  44. 44. extension L @ExtensionMethod({ Dog.class, MyDogExtensionClass.class }) public class DogWithExtension { public void foo() { Dog milou = new Dog("Milou", 12.5, ...); boolean isTooFat = milou.isTooFat(); } } class MyDogExtensionClass { public static boolean isTooFat(final Dog dog) { double imc = dog.getWeight() / pow(dog.getSize(), 2); return 25 < imc; } } Avec paramètres  FAQ 9  http://blog.developpez.com/todaystip/p11165/dev/java/extensionmethod-de-lombok-pg/
  45. 45. Lombok or not Lombok ? Avantages et inconvénients
  46. 46. Pro / Cons     Byte code modifié  Version en 0.x Documentation des prog ? Magique ?     Compacité Lecture simplifiée Code normée Délombok (pour essayer)
  47. 47. Guava tour d’horizon
  48. 48. Factory Methods Les choses que j’aime
  49. 49. Java 5 < new Vs static factories > List<Integer> primeNumbers = new ArrayList<Integer>(); Set<String> colors = new TreeSet<String>(); 5 Map<String, Integer> ages = new HashMap<String, Integer>();
  50. 50. < new Vs static factories > Java 5 5 List<Integer> primeNumbers = new ArrayList<Integer>(); Set<String> colors = new TreeSet<String>(); dur dur ? Map<String, Integer> ages = new HashMap<String, Integer>(); Map<String, List<String>> trucs = new HashMap<String, List<String>>(); 5 Map<? extends Person, Map<String, List<String>>> trucs = new TreeMap<? extends Person, Map<String, List<String>>>(); Map<? extends Wrapper<String, Sex, Person>, Map<String, List<Set<Adress<String, Integer, Country>>>>> trucs = ...
  51. 51. Java 5 < new Vs static factories > List<Integer> primeNumbers = new ArrayList<Integer>(); Set<String> colors = new TreeSet<String>(); 5 7 Java 7 Map<String, Integer> ages = new HashMap<String, Integer>(); List<Integer> primeNumbers = new ArrayList<>(); Set<String> colors = new TreeSet<>(); Map<String, Integer> ages = new HashMap<>(); Qui utilise Java 7 en prod ?
  52. 52. Java 5 < new Vs static factories > List<Integer> primeNumbers = new ArrayList<Integer>(); Set<String> colors = new TreeSet<String>(); 5 7 G Java 7 Map<String, Integer> ages = new HashMap<String, Integer>(); List<Integer> primeNumbers = new ArrayList<>(); Set<String> colors = new TreeSet<>(); Map<String, Integer> ages = new HashMap<>(); Guava Qui utilise Java 7 en prod ? List<Integer> primeNumbers = newArrayList(); Set<String> colors = newTreeSet(); Map<String, Integer> ages = newHashMap(); Dès maintenant !
  53. 53. Java 5 < new Vs static factories > List<Integer> primeNumbers = new ArrayList<Integer>(); Set<String> colors = new TreeSet<String>(); 5 7 G Java 7 Map<String, Integer> ages = new HashMap<String, Integer>(); List<Integer> primeNumbers = new ArrayList<>(); Set<String> colors = new TreeSet<>(); Map<String, Integer> ages = new HashMap<>(); Guava Qui utilise Java 7 en prod ? List<Integer> primeNumbers = newArrayList(); Set<String> colors = newTreeSet(); Map<String, Integer> ages = newHashMap(); Lombok Dès maintenant ! var primeNumbers = new ArrayList<Integer>(); -> primeNumbers.size(); ... L
  54. 54. List of dogs < new Vs static factories > List<Dog> dogs = newArrayList( new Dog("Milou", 12.5, MALE, ...), new Dog("Rintintin", 45.0, MALE, ...), new Dog("Volt", 10.3, MALE, ...), new Dog("Lassie", 45.0, FEMALE, ...), new Dog("Pluto", 22.0, MALE, ...), new Dog("Medor", 35.6, MALE, ...)); [Milou, Rintintin, Volt, Lassie, Pluto, Medor] G
  55. 55. Immutables Pour que ça ne change pas
  56. 56. immutable Quand ?
  57. 57. immutable Quand ? mutable On se demande souvent si une liste doit être immutable mais c’est prendre le problème dans le mauvais sens. La plupart du temps, ce qu’il faut vraiment se demander, c’est si la liste a besoin d’être mutable.
  58. 58. Java 5 < unmodifiables Vs immutables > Set<Integer> temp = new LinkedHashSet<Integer>(Arrays.asList(1, 2, 3, 5, 7)); Set<Integer> primes = Collections.unmodifiableSet(temp);
  59. 59. Java 5 < unmodifiables Vs immutables > Set<Integer> temp = new LinkedHashSet<Integer>(Arrays.asList(1, 2, 3, 5, 7)); Guava Set<Integer> primes = Collections.unmodifiableSet(temp); Set<Integer> primes = ImmutableSet.of(1, 2, 3, 5, 7); G
  60. 60. Of < unmodifiables Vs immutables > ImmutableSet.of(E ImmutableSet.of(E ImmutableSet.of(E ImmutableSet.of(E ImmutableSet.of(E ImmutableSet.of(E e1) e1, e1, e1, e1, e1, E E E E E e2) e2, e2, e2, e2, E E E E G e3) e3, E e4) e3, E e4, E e5) e3, E e4, E e5, E e6, E...) Of Ne prend pas de null ImmutableSet.of() Vide Map et List  FAQ 4  http://blog.developpez.com/guava/p10589/collection/title-212/
  61. 61. Java 5 < Copie de défense > public class Dog { private String name; ... private List<String> colors; public Dog(String name, List<String> colors) { this.name = name; ... this.colors = Collections.unmodifiableList( new ArrayList<String>(colors)); } public List<String> getColors() { return colors; } 5
  62. 62. Guava < Copie de défense > public class Dog { private String name; ... private ImmutableList<String> colors; public Dog(String name, List<String> colors) { this.name = name; ... this.colors = ImmutableList.copyOf(colors); } public ImmutableList<String> getColors() { return colors; } Message clair G
  63. 63. Collections en plus Multimap, Bipap, Multiset
  64. 64. Java 5 < Multi Map > Map<String, List<String>> dogFavoriteColors = new HashMap<String, List<String>>(); 5 5 List<String> milouColors = dogFavoriteColors.get("Milou"); if(milouColors == null) { milouColors = new ArrayList<String>(); dogFavoriteColors.put("Milou",milouColors); } milouColors.add("Vert");
  65. 65. Java 5 < Multi Map > Map<String, List<String>> dogFavoriteColors = new HashMap<String, List<String>>(); 5 5 Guava List<String> milouColors = dogFavoriteColors.get("Milou"); if(milouColors == null) { milouColors = new ArrayList<String>(); dogFavoriteColors.put("Milou",milouColors); } milouColors.add("Vert"); Multimap<String, String> dogFavoriteColors = HashMultimap.create(); dogFvoriteColors2.put("Milou", "Jaune"); dogFavoriteColors2.put("Milou", "Rouge"); G
  66. 66. Guava < Bi Map > BiMap<String, Dog> tatouages = HashBiMap.create(); tatouages.put("ABC123", new Dog("Milou") ); tatouages.put("MBD324", new Dog("Volt") ); tatouages.put("JFT672", new Dog("Lassie") ); println( tatouages ); {ABC123=Milou, MBD324=Volt, JFT672=Lassie} ABC123=Milou MDB324=Volt JFT672=Lassie println( tatouages.inverse() ); Une map bijective {Milou=ABC123, Volt=MBD324, Lassie=JFT672} Il est possible de changer la valeur associée à une clé mais pas d'avoir deux clés avec la même valeur (IllegalArgumentException). G
  67. 67. Guava < Multi Set > Multiset<Integer> ages = HashMultiset.create(); ages.add(2); ages.add(3); ages.add(7); ages.add(11); ages.add(3); ages.add(5); println( ages ); [2, 3 x 2, 5, 7, 11] println( ages.count(3) ) 2 G
  68. 68. Base Préconditions, joiner, splitter, optional
  69. 69.     toString () equals () hashCode () compareTo ()
  70. 70. DOG < Preconditions > public class Dog { private Integer private String private String ... id ; name ; fullName ; public Dog(String name, String fullName, ...) { if(name == null) { throw new NPE("Le nom bla bla"); } if(fullName == null) { throw new NPE("bla bla"); } ... this.name = name; this.fullName = fullName; ... } 5
  71. 71. DOG < Preconditions > import static com.google.common.base.Preconditions.*; public class Dog { private Integer private String private String ... id ; name ; fullName ; G public Dog(String name, String fullName, ...) { this.name = checkNotNull(name, "bla bla"); this.fullName = checkNotNull(fullName, "bla bla"); ... } checkNotNull()  NPE checkArgument()  IAE checkState()  ISE
  72. 72. Joiner String names = Joiner.on(", ") .join(newArrayList("Lassie", "Volt", "Milou")); "Lassie, Volt, Milou" G Java classique List<String> dogNames = newArrayList("Lassie", "Volt", "Milou"); StringBuilder sb = new StringBuilder(); boolean first = true; for (String name : dogNames) { if(name != null || name.trim().isEmpty()) { continue; } if (!first) { sb.append(", "); } sb.append(name); first = false; } String names = sb.toString();
  73. 73. Joiner String names = Joiner.on(", ") .join(newArrayList("Lassie", "Volt", "Milou")); "Lassie, Volt, Milou" G String names = Joiner.on(", ") .join(newArrayList("Lassie", "Volt", null, "Milou"));  NPE 
  74. 74. Joiner String names = Joiner.on(", ") .join(newArrayList("Lassie", "Volt", "Milou")); "Lassie, Volt, Milou" G String names = Joiner.on(", ") .join(newArrayList("Lassie", "Volt", null, "Milou"));  NPE  G String names = Joiner.on(", ") .skipNulls() .join(newArrayList("Lassie", "Volt", null, "Milou")); "Lassie, Volt, Milou"
  75. 75. Joiner String names = Joiner.on(", ") .join(newArrayList("Lassie", "Volt", "Milou")); "Lassie, Volt, Milou" G String names = Joiner.on(", ") .join(newArrayList("Lassie", "Volt", null, "Milou"));  NPE  G G String names = Joiner.on(", ") .skipNulls() .join(newArrayList("Lassie", "Volt", null, "Milou")); "Lassie, Volt, Milou" String names = Joiner.on(", ") .useForNull("Anonymous")) .join(newArrayList("Lassie", "Volt", null, "Milou")); "Lassie, Volt, Anonymous, Milou"  http://blog.developpez.com/guava/p11054/base/joiner-pour-assembler-des-items/
  76. 76. Splitter Iterable<String> dogNames = Splitter.on(",") .split("Lassie, Volt, Milou"); [ "Lassie", "Volt", "Milou" ]
  77. 77. Splitter Iterable<String> dogNames = Splitter.on(",") .split("Lassie, Volt, Milou"); [ "Lassie", "Volt", "Milou" ] Iterable<String> dogNames = Splitter.on(",") [ "Lassie", .split("Lassie, Volt, ,Milou"); "Volt", " ", "Milou" ]
  78. 78. Splitter Iterable<String> dogNames = Splitter.on(",") .split("Lassie, Volt, Milou"); [ "Lassie", "Volt", "Milou" ] Iterable<String> dogNames = Splitter.on(",") [ "Lassie", .split("Lassie, Volt, ,Milou"); "Volt", " ", "Milou" ] Iterable<String> dogNames = Splitter.on(",") [ "Lassie", .trimResults() "Volt", .split("Lassie, Volt, ,Milou"); "", "Milou" ]
  79. 79. Splitter Iterable<String> dogNames = Splitter.on(",") .split("Lassie, Volt, Milou"); [ "Lassie", "Volt", "Milou" ] Iterable<String> dogNames = Splitter.on(",") [ "Lassie", .split("Lassie, Volt, ,Milou"); "Volt", " ", "Milou" ] Iterable<String> dogNames = Splitter.on(",") [ "Lassie", .trimResults() "Volt", .split("Lassie, Volt, ,Milou"); "", "Milou" ] Iterable<String> dogNames = Splitter.on(",") .trimResults() [ "Lassie", .omitEmptyStrings() .split("Lassie, Volt, ,Milou"); "Volt", "Milou" ]  http://blog.developpez.com/guava/p11045/annotation/splitter-pour-separer-des-items/ G
  80. 80. Optional Wrapper Optional <T> Dog dog = new Dog("Milou", ...); Optional<Dog> opt = Optional.of(dog); assertTrue( opt.isPresent() ); assertEquals( "Milou", opt.get().getName() );
  81. 81. Optional Wrapper Optional <T> Dog dog = new Dog("Milou", ...); Optional<Dog> opt = Optional.of(dog); assertTrue( opt.isPresent() ); assertEquals( "Milou", opt.get().getName() ); Optional<Dog> opt = Optional.absent(); assertFalse( opt.isPresent() ); opt.get();  ISE
  82. 82. Optional Wrapper Optional <T> Dog dog = new Dog("Milou", ...); Optional<Dog> opt = Optional.of(dog); assertTrue( opt.isPresent() ); assertEquals( "Milou", opt.get().getName() ); Optional<Dog> opt = Optional.absent(); assertFalse( opt.isPresent() ); opt.get();  ISE Dog dog = null; Optional<Dog> opt = Optional.of(dog);  NPE Optional<Dog> opt = Optional.fromNullable(dog);
  83. 83. Optional Wrapper Optional <T> Dog dog = new Dog("Milou", ...); Optional<Dog> opt = Optional.of(dog); assertTrue( opt.isPresent() ); assertEquals( "Milou", opt.get().getName() ); Optional<Dog> opt = Optional.absent(); assertFalse( opt.isPresent() ); opt.get();  ISE Dog dog = null; Optional<Dog> opt = Optional.of(dog);  NPE Optional<Dog> opt = Optional.fromNullable(dog); Dog dog = null; Optional<Dog> opt = Optional.fromNullable(dog); Dog dog2 = opt.or( new Dog("noname", ...) ); assertEquals( "noname", dog2.getName() );  http://blog.developpez.com/guava/p11163/base/le-wrapper-optional-de-guava/
  84. 84. Functional Programming todo
  85. 85. Super chien Dog
  86. 86. Super Chien public class SuperChien implements SuperHero { private private private private String double Set<String> Set<String> surnom ; poids ; couleursCostume ; pouvoirs ; 5 ... Les héros peuvent avoir plusieurs costumes donc je n’utilise pas un ImmutableSet. Idem pour les pouvoirs dont la liste augmente avec l’expérience.
  87. 87. Transformation < Transformation > List<SuperChien> superChiens = Lists.transform(dogs, new Function<Dog, SuperChien>() { @Override public SuperChien apply(Dog dog) { SuperChien chien = new SuperChien(); G chien.setSurnom("Super " + dog.getName()); chien.setPoids(dog.getWeight()); chien.setCouleursCostume(newHashSet(dog.getColors())) chien.setPouvoirs(newHashSet("Code en Java", "Vole")) ... return chien; } }); [Super Milou, Super Rintintin, Super Volt, Super Lassie, Super Pluto, Super Medor]
  88. 88. Transformation < Transformation > List<SuperChien> superChiens = Lists.transform(dogs, new Function<Dog, SuperChien>() { @Override public SuperChien apply(Dog dog) { SuperChien chien = new SuperChien(); ... return chien; } }); G  Vue (lazy)  size / isEmpty dispo   Pas pour traitements répétés   FAQ 3 List<SuperChien> chiens = newArrayList(Lists.transform(... ImmutableList<SuperChien> chiens = ImmutableList.copyOf(Lists.transform(...
  89. 89. < Filtre > Filtre G Predicate<Dog> malePredicate = new Predicate<Dog>() { public boolean apply(Dog dog) { return dog.getSex() == MALE; } } Iterable<Dog> maleDogs = Iterables.filter(dogs, malePredicate); [Milou, Rintintin, Volt, Pluto, Medor] G
  90. 90. Filtre < Filtre > Predicate<Dog> malePredicate = new Predicate<Dog>() { public boolean apply(Dog dog) { return dog.getSex() == MALE; } } Iterable<Dog> maleDogs = Iterables.filter(dogs, malePredicate); [Milou, Rintintin, Volt, Pluto, Medor] Dog firstMaleDog = Iterables.find(dogs, malePredicate); Milou G G G
  91. 91. Filtre < Filtre > Predicate<Dog> malePredicate = new Predicate<Dog>() { public boolean apply(Dog dog) { return dog.getSex() == MALE; } } Iterable<Dog> maleDogs = Iterables.filter(dogs, malePredicate); [Milou, Rintintin, Volt, Pluto, Medor] Dog firstMaleDog = Iterables.find(dogs, malePredicate); Milou G G G Dog firstMaleDog = Iterables.find(femaleDogs, malePredicate, DEFAULT_DOG ); Default dog
  92. 92. Seconde liste List<Dog> dogs2 = newArrayList( new Dog("Rintintin", 45.0, MALE, ...), new Dog("Pluto", 22.0, MALE, ...), new Dog("Lulu", 35.6, MALE, ...)); [Rintintin, Pluto, Lulu] Liste 2 : dogs2 [Milou, Rintintin, Volt, Lassie, Pluto, Medor] Liste 1 : dogs G
  93. 93. Pas fluent < Fluent or not fluent ? > Predicate<Dog> malePredicate = new Predicate<Dog>() { public boolean apply(Dog dog) { return dog.getSex() == MALE; }}; Function<FullDog, String> nameFunction = new Function<FullDog, String>() { public String apply(FullDog dog) { return dog.getName(); }}; Iterable<FullDog> maleDogs = Iterables.filter(dogs, malePredicate); Iterable<String> maleNames = Iterables.transform(maleDogs, nameFunction); G G G [Milou, Rintintin, Volt, Pluto, Medor]
  94. 94. Pas fluent < Fluent or not fluent ? > Iterable<FullDog> maleDogs = Iterables.filter(dogs, malePredicate); Fluent Iterable<String> maleNames = Iterables.transform(maleDogs, nameFunction); List<String> maleNames2 = FluentIterable.from(dogs) .filter(malePredicate) .transform(nameFunction) .toImmutableList(); G G Guava 12.0  http://blog.developpez.com/guava/p11092/annotation/fluentiterable-surmon-chien-guava/ [Milou, Rintintin, Volt, Pluto, Medor]
  95. 95. Cache todo
  96. 96. Web Service < Memoization > public class DogService { @Inject private PetShopWebService service; public Integer getNumberDogsSoldYesterday() { return service.checkSales( "dog" ); } 5
  97. 97. Web Service < Memoization > Cache manuel public class DogService { @Inject private PetShopWebService service; public Integer getNumberDogsSoldYesterday() { return service.checkSales( "dog" ); } private Integer nbOfDogsSold; public Integer getNumberDogsSoldYesterday() { if (nbOfDogsSold == null) { nbOfDogsSold = service.checkSales( "dog" ); } return nbOfDogsSold; } 5 5 Double check null…
  98. 98. Guava < Memoization > public class DogService { @Inject private PetShopWebService service; private Supplier<Integer> nbOfDogsSoldSupplier = Suppliers.memoize( new Supplier<Integer>() { public Integer get() { return service.checkSales( "dog" ); } }); public Integer getNumberDogsSoldYesterday() { return nbOfDogsSoldSupplier.get(); } G
  99. 99. Guava < Memoization > public class DogService { @Inject private PetShopWebService service; private Supplier<Integer> nbOfDogsSoldSupplier = Suppliers.memoizeWithExpiration( new Supplier<Integer>() { public Integer get() { return service.checkSales( "dog" ); } }, 1, TimeUnit.DAYS ); public Integer getNumberDogsSoldYesterday() { return nbOfDogsSoldSupplier.get(); } G
  100. 100. Web Service < Cache > public class DogService { @Inject private PetShopWebService service; private Map<String, Dog> dogMap = Maps.newHashMap(); 5 public Integer getDog(String name) { Dog dog = dogMap.get(name); if(dog == null) { dog = service.getAnimal( "dog", name ); // type-name dogMap.put( name, dog ); } return dog; } Quid du timeout ? Max ?
  101. 101. Guava < Cache > public class DogService { @Inject private PetShopWebService service; G private LoadingCache<String, Dog> dogCache = CacheBuilder.newBuilder() .maximumSize(2000) .expireAfterWrite(30, TimeUnit.MINUTES) .build(new CacheLoader<String, Dog>() { public Dog load(String key) { return service.getAnimal( "dog", key ); } }); public Integer getDog(String name) { return dogCache.get( name ); // + try-catch }
  102. 102. Hash Fantôme
  103. 103. Hash HashFunction hf = Hashing.md5(); HashCode hc = hf.newHasher() .putInt(123) .putString("Milou") .hash(); byte[] bytes = hc.asBytes();        md5 Murmur3 128 bits Murmur3 32 bits Sha1 Sha256 Sha512 goodFastHash G
  104. 104. Préparation < Is in list ? > int NB_OF_DOGS = 100000; contains List<Dog> dogs = newArrayList(); Random rand = new Random(); for (int i = 0; i < NB_OF_DOGS; i++) { Dog dog = new Dog(); dog.setName("abc" + rand.nextInt(999)); ... dogs.add(dog); } final Dog milou = new Dog(); milou.setName("Milou"); ... boolean isInList = dogs.contains(milou); 5 5 false (14 ms) dogs.add(milou); boolean isInList = dogs.contains(milou); true (14 ms)
  105. 105. Bloom filter < Is in list ? > Funnel<Dog> dogFunnel = new Funnel<Dog>() { public void funnel(Dogdog, PrimitiveSink sink) { sink.putString(dog.getName()) .putString(dog.getFullName()) .putString(dog.getRace()); }}; G BloomFilter<Dog> bloom = BloomFilter.create(dogFunnel, NB_OF_DOGS, 0.01); for (int i = 0; i < NB_OF_DOGS; i++) { ... bloom.put(dog); boolean isInList = bloom.mightContain(milou); false (0 ms) bloom.put(milou); boolean isInList = bloom.mightContain(milou); Guava 13 true (0 ms)  http://blog.developpez.com/guava/p11149/collection/bloom-filter-de-guava-13/
  106. 106. Guava or not Guava ? Avantages et inconvénients
  107. 107. Pro / Cons  Ne pas en abuser…  Utile  Bonnes pratiques
  108. 108. LIENS @thierryleriche
  109. 109. Guava  http://code.google.com/p/guava-libraries Lombok  http://projectlombok.org Lombok-pg  https://github.com/peichhorn/lombok-pg
  110. 110. ICAUDA  http://icauda.com  http://icauda.com/articles.html  http://icauda.com/cours.html (articles) (slides) Blog Guava  http://blog.developpez.com/guava « Simplifier le code de vos beans Java à l'aide de Commons Lang, Guava et Lombok »  http://thierry-leriche-dessirier.developpez.com/tutoriels/ java/simplifier-code-guava-lombok (article)
  111. 111. MERCI
  112. 112. FAQ / Bonus 1. Guava Vs Commons 2. Régime façon Apache 3. Fonctionnal prog Vs boucle for 4. Créer des Maps 5. Charsets 6. Converter Spring 7. Orderings 8. Licences 9. Extension avec valeurs 10. Chrono 11. CharMatcher 12. Impl 13. And, or, in… 14. Partition, limit
  113. 113. Guava Vs Commons ? http://tinyurl.com/guava-vs-apache 1
  114. 114. toString Régime : la méthode Commons ? public String toString() { return new ToStringBuilder(this) .append("id", id) .append("name", name) .append("fullName", fullName) ... .append("colors", colors) .toString(); } 2 L
  115. 115. equals Régime : la méthode Commons ? public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (!(obj instanceof Dog)) return false; Dog other = (Dog) obj; return new EqualsBuilder() .append(birthday, other.birthday) .append(fullname, other.fullname) .append(name, other.name) .append(race, other.race) .append(sex, other.sex) .isEquals(); 2 } L
  116. 116. hashCode Régime : la méthode Commons ? public int hashCode() { return new HashCodeBuilder(17, 37) .append(birthday) .append(fullname) .append(name) .append(race) .append(sex) .toHashCode(); } 2 L
  117. 117. compareTo Régime : la méthode Commons ? public int compareTo(Dog other) { return new CompareToBuilder() .append(name, other.name) .append(fullname, other.fullname) .append(birthday, other.birthday) ... .append(sex, other.sex) .toComparison(); } 2 L
  118. 118. Transformation Fonctionnal prog Vs boucle for : quand ? List<SuperChien> superChiens = newArrayList( Lists.transform(dogs, new Function<Dog, SuperChien>() { @Override public SuperChien apply(Dog dog) { SuperChien chien = new SuperChien(); ... return chien; } })); 3 Vs G List<SuperChien> superChiens = newArrayList(); for(Dog dog : dogs) { SuperChien chien = new SuperChien(); ... superChiens.add(chien); } G http://code.google.com/p/guava-libraries/wiki/FunctionalExplained
  119. 119. of Créer des Maps public static final ImmutableMap<String, Integer> AGES = ImmutableMap.of("Milou", 32, "Volt", 7, "Pluto", 37, "Lassie", 17); Builder G 4 public static final ImmutableMap<String, Integer> AGES = new ImmutableMap.Builder<String, Integer>() .put("Milou", 32) .put("Volt", 7) .put("Pluto", 37) .put("Lassie", 17) .put("Medor", 5) .put("Croquette", 8) .put("Loulou", 2) ... .build(); G
  120. 120. Java 5 Charsets String name = "Milou"; try { byte[] bytes = name.getBytes("UTF-8"); 5 } catch (UnsupportedEncodingException e) { throw new AssertionError(e); } Guava Ca n’arrive jamais cette exception  5 String name = "Milou"; byte[] bytes = name.getBytes(Charsets.UTF_8); G
  121. 121. Converter Spring import org.springframework...Converter; G @Component("dogToChienConverter") public class DogToChienConverter implements Converter<List<Dog>, List<SuperChien>> { 6 public List<SuperChien> convert(List<Dog> dogs) { List<SuperChien> chiens = newArrayList(transform(dogs, new Function<Dog, SuperChien>() { public SuperChien apply(Dog dog) { ... return chien; } })); return chiens; } Lazy or not lazy ?
  122. 122. Orderings 7
  123. 123. Licences  Lombok :  Lombok-pg :  Guava : Apache License 2.0  Commons : 8 MIT License MIT License Apache License 2.0
  124. 124. Extension avec valeurs @ExtensionMethod({ Object.class, MyOtherClass.class }) public class DogWithExtension { public void foo() { String s1 = "toto"; s1.print(); //  toto String s2 = null; s2.print(); //  null } } class MyOtherClass { public static <T> void print(final T value) { System.out.println(value); } } 9 On peut mettre autre chose qu’un "Object", par exemple un "Arrays" , un "Dog" , etc. L
  125. 125. Extension avec valeurs @ExtensionMethod({ Object.class, MyOtherClass.class }) public class DogWithExtension { public void foo() { String s1 = "toto"; s1.print(); //  toto String s2 = null; s2.print(); s2.print("vide"); //  null //  vide } } 9 class MyOtherClass { public static <T> void print(final T value) { System.out.println(value); } public static void print(String value, String other) { if (value == null || value.isEmpty()) { System.out.println(other); } else { System.out.println(value); } L
  126. 126. < Chrono > Guava Java 5 long start = new Date().getTime(); foo(); // traitement long (ou pas) long end = new Date().getTime(); 5 long duration = end - start; // 11 ms Stopwatch sw = new Stopwatch(); sw.start(); foo(); sw.stop(); long duration = sw.elapsedMillis(); // 11 ms 10 G long nano = sw.elapsedTime(NANOSECONDS); // 11179739 ns long micro = sw.elapsedTime(MICROSECONDS); // 11179 us long millis = sw.elapsedTime(MILLISECONDS); // 11 ms  http://blog.developpez.com/guava/p11160/base/le-stop-watch-de-guava/
  127. 127. CharMatcher 11
  128. 128. Impl public class Dog implements Comparable<Dog> { private Integer id ; private String name ; private String fullName ; 5 ... @Override public int compareTo(Dog dog) { return ...; } 12 implements List ? aie aie aie
  129. 129. Impl @AutoGenMethodStub public class Dog implements Comparable<Dog> { private Integer id ; private String name ; private String fullName ; ... 12 L
  130. 130. And, or, in... And, or, in… G import static com.google.common.base.Predicates.and; import static com.google.common.base.Predicates.in; boolean isRintintinInBoth = and( in(dogs), in(dogs2) ) .apply(new Dog("Rintintin")); true G import static com.google.common.base.Predicates.or; [Milou, Rintintin, Volt, Lassie, Pluto, Medor] Liste 2 : dogs2 13 Liste 1 : dogs boolean isTintinInOne = or( in(dogs), in(dogs2) ) .apply(new Dog("Tintin"); false [Rintintin, Pluto, Lulu]
  131. 131. Partition Limit Partition, limit List<List<FullDog>> partition = Lists.partition(dogs, 4); [Milou, Rintintin, Volt, Lassie] [Pluto, Medor] List<FullDog> first4Dogs = newArrayList(Iterables.limit(dogs, 4)); 14 [Milou, Rintintin, Volt, Lassie] G G
  132. 132. Slides en préparation
  133. 133. I/O todo
  134. 134. Ressources < I/O > public void lireJava6(String from) { InputStream in = null; try { in = new FileInputStream(from); byte[] b = new byte[10000]; while (true) { int r = in.read(b); if (r == -1) break; ... } } catch (Exception e) { ... } finally { if (in != null) { try { in.close(); } catch (Exception e) { ... } } ... 5
  135. 135. Java 7 < I/O > public void lireJava7(String from) { try(InputStream in = new FileInputStream(from)) { ... while (true) { ... } } } 7
  136. 136. Guava < I/O > Todo G
  137. 137. Concurrent / future todo
  138. 138. Todo

×