Milou fait un régime Guava - Lombok
SPONSORS
@thierryleriche                       Thierry Leriche-Dessirier                     Consultant JEE freelance             ...
Cours                  ForumsFAQ                    NewsInterviews             CritiquesArticles / tutoriels   AgendasMaga...
13 OOO OOO pages vues par mois5 500 000 visites par mois2 500 000 visites uniques par mois5 000 messages forum par jour
 Milou est trop lourd (intro)Agenda      Lombok (et Lombok-pg) en action      Tour d’horizon de Guava
Milou est trop lourd (et doit faire un régime)       I am Milou
5DOG      public class Dog {       private   Integer        id ;       private   String         name ;       private   Str...
   Constructeurs                  Getters / setters                  toString ()                  equals ()           ...
   Constructeurs                              Getters / setters                              toString ()               ...
public class Dog       implements Comparable<Dog> { ... @Override public int compareTo(Dog other) {   int result = 0;     ...
    Constructeurs                   Getters / setters                   toString ()                   equals ()       ...
10 attributsJava   210 lignes de code
Va chercher Guava                                    toString ()                                   equals ()           ...
Base       Objects
Java 5     public String toString() {       return "Dog [id=" + id         + ", name=" + name         + ", fullName=" + fu...
Java 5     public String toString() {       StringBuilder sb = new StringBuilder();         sb.append(Dog.class.getSimpleN...
Guava    public String toString() {      return Objects.toStringHelper(this)               .add("id", id)               .a...
birthday, fullname, name, race et sexJava 5     public boolean equals(Object obj) {       if (this == obj) return true;   ...
birthday, fullname, name, race et sexGuava    public boolean equals(Object obj) {      if (!(obj instanceof Dog)) return f...
birthday, fullname, name, race et sexJava 5     public int hashCode() {       final int prime = 31;       int result = 1; ...
birthday, fullname, name, race et sexGuava    public int hashCode() {    }        return Objects.hashCode(birthday, fullNa...
name, fullname, birthday, weight, size, race et sexJava 5     public int compareTo(Dog other) {       int result = 0;     ...
name.compareTo(other.name)                 Vsother.name.compareTo(name) compareTo ()
name, fullname, birthday, weight, size, race et sexGuava    public int compareTo(Dog other) {      return ComparisonChain....
Lombok     en action
Régime         Annotations de base
Régime    @NoArgsConstructor /           @RequiredArgsConstructor /           @AllArgsConstructor  constructeurs        ...
Régime                @NoArgsConstructor /                       @RequiredArgsConstructor /                       @AllArg...
10 attributs  Java   210 lignes de codeLombok   12 lignes + 2-3 @ + compareTo()
Factory      @RequiredArgsConstructor(staticName = "of")      public class Dog {          private Integer id;          @No...
Factory      @RequiredArgsConstructor(staticName = "of")      public class Dog {          private Integer id;          @No...
Trucs pratiques                  Se simplifier la vie
Pratique      @Cleanup              @Synchronized              @SneakyThrows              @Log              @Delegate...
Ressources         public void lireJava6(String from) {           InputStream in = null;           try {             in = ...
Ressources         public void lire(String from) throws IOException {             @Cleanup             InputStream in = ne...
Délombok           Revenir sans la lib
java -jar lombok.jar delombok src -d src-delombokedDélombok       <properties>         <lombok.sourceDirectory>           ...
Délombok       @Data       public class Dog {                                 5                                           ...
Lombok-pg      Annotations supplémentaires
Annotations Pg                    @Action                        @Builder                    @Function                 ...
Fluent     @FluentSetter     @Getter     public class Dog {         private Integer id ;                                  ...
Builder      @Builder      @Getter      public class Dog {          private Integer id ;                                  ...
extension        @ExtensionMethod({ Dog.class, MyDogExtensionClass.class })        public class DogWithExtension {        ...
Lombok or not Lombok ?              Avantages et inconvénients
Pro / Cons                Byte code modifié                 Version en 0.x                Documentation des prog ?    ...
Guava    tour d’horizon
Factory Methods              Les choses que j’aime
< new Vs static factories >Java 5     List<Integer> primeNumbers = new ArrayList<Integer>();     Set<String> colors = new ...
< new Vs static factories >Java 5  List<Integer> primeNumbers = new ArrayList<Integer>();        Set<String> colors = new ...
< new Vs static factories >Java 5     List<Integer> primeNumbers = new ArrayList<Integer>();     Set<String> colors = new ...
< new Vs static factories >Java 5     List<Integer> primeNumbers = new ArrayList<Integer>();     Set<String> colors = new ...
< new Vs static factories >Java 5     List<Integer> primeNumbers = new ArrayList<Integer>();     Set<String> colors = new ...
< new Vs static factories >                                                                             GList of dogs   Li...
Immutables        Pour que ça ne change pas
immutableQuand ?
immutable                 Quand ?           mutableOn se demande souvent si une liste doit être immutable maisc’est prendr...
< unmodifiables Vs immutables >Java 5     Set<Integer> temp =        new LinkedHashSet<Integer>(Arrays.asList(1, 2, 3, 5, ...
< unmodifiables Vs immutables >Java 5     Set<Integer> temp =        new LinkedHashSet<Integer>(Arrays.asList(1, 2, 3, 5, ...
< unmodifiables Vs immutables >Of ImmutableSet.of(E ImmutableSet.of(E ImmutableSet.of(E ImmutableSet.of(E ImmutableSet.of(...
< Copie de défense >Java 5   public class Dog {          private String name;          ...          private List<String> c...
< Copie de défense >Guava   public class Dog {         private String name;         ...         private ImmutableList<Stri...
Collections en plus              Multimap, Bipap, Multiset
< Multi Map >Java 5     Map<String, List<String>> dogFavoriteColors =       new HashMap<String, List<String>>();          ...
< Multi Map >Java 5     Map<String, List<String>> dogFavoriteColors =       new HashMap<String, List<String>>();          ...
< Bi Map >                                                                             GGuava    BiMap<String, Dog> tatoua...
< Multi Set >Guava                                                              G        Multiset<Integer> ages = HashMult...
BasePréconditions, joiner, splitter, optional
   toString ()   equals ()   hashCode ()   compareTo ()
< Preconditions >DOG      public class Dog {       private Integer       private String       private String              ...
< Preconditions >DOG                                                           G      import static com.google.common.base...
Joiner     String names = Joiner.on(", ")       .join(newArrayList("Lassie", "Volt", "Milou"));                           ...
Joiner     String names = Joiner.on(", ")       .join(newArrayList("Lassie", "Volt", "Milou"));                           ...
Joiner     String names = Joiner.on(", ")       .join(newArrayList("Lassie", "Volt", "Milou"));                           ...
Joiner     String names = Joiner.on(", ")       .join(newArrayList("Lassie", "Volt", "Milou"));                           ...
Splitter       Iterable<String> dogNames =         Splitter.on(",")                         [ "Lassie",                 .s...
Splitter       Iterable<String> dogNames =         Splitter.on(",")                              [ "Lassie",              ...
Splitter       Iterable<String> dogNames =         Splitter.on(",")                              [ "Lassie",              ...
Splitter       Iterable<String> dogNames =         Splitter.on(",")                                                       ...
Wrapper Optional <T>Optional           Dog dog = new Dog("Milou", ...);           Optional<Dog> opt = Optional.of(dog);   ...
Wrapper Optional <T>Optional           Dog dog = new Dog("Milou", ...);           Optional<Dog> opt = Optional.of(dog);   ...
Wrapper Optional <T>Optional           Dog dog = new Dog("Milou", ...);           Optional<Dog> opt = Optional.of(dog);   ...
Wrapper Optional <T>Optional           Dog dog = new Dog("Milou", ...);           Optional<Dog> opt = Optional.of(dog);   ...
Functional Programming                         todo
Super chienDog
Super Chien              public class SuperChien implements SuperHero {               private               private       ...
< Transformation >Transformation             List<SuperChien> superChiens =               Lists.transform(dogs,           ...
< Transformation >Transformation                                                                         G             Lis...
< Filtre >Filtre     Predicate<Dog> malePredicate =       new Predicate<Dog>() {         public boolean apply(Dog dog) {  ...
< Filtre >Filtre     Predicate<Dog> malePredicate =       new Predicate<Dog>() {         public boolean apply(Dog dog) {  ...
< Filtre >Filtre     Predicate<Dog> malePredicate =       new Predicate<Dog>() {         public boolean apply(Dog dog) {  ...
< Fluent or not fluent ? >Pas fluent         Predicate<Dog> malePredicate =           new Predicate<Dog>() {             p...
< Fluent or not fluent ? >Pas fluent         Iterable<FullDog> maleDogs =           Iterables.filter(dogs, malePredicate);...
Cache        todo
< Memoization >Web Service          public class DogService {              @Inject              private PetShopWebService ...
< Memoization >Web Service           public class DogService {               @Inject               private PetShopWebServi...
< Memoization >Guava    public class DogService {        @Inject        private PetShopWebService service;        private ...
< Memoization >Guava    public class DogService {        @Inject        private PetShopWebService service;        private ...
< Cache >Web Service          public class DogService {              @Inject              private PetShopWebService servic...
< Cache >Guava    public class DogService {        @Inject        private PetShopWebService service;        private Loadin...
Hash       Fantôme
Hash   HashFunction hf = Hashing.md5();   HashCode hc = hf.newHasher()                   .putInt(123)                   .p...
< Is in list ? >Préparation           int NB_OF_DOGS = 100000;           List<Dog> dogs = newArrayList();           Random...
< Is in list ? >Bloom filter           Funnel<Dog> dogFunnel = new Funnel<Dog>() {             public void funnel(Dogdog, ...
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-librariesLombok http://projectlombok.orgLombok-pg https://github.com/peichhorn/lom...
ICAUDA http://icauda.com http://icauda.com/articles.html           (articles) http://icauda.com/cours.html             ...
MERCI
1. Guava Vs CommonsFAQ / Bonus              2. Régime façon Apache              3. Fonctionnal prog Vs boucle for         ...
Guava Vs Commons ?    http://tinyurl.com/guava-vs-apache1
Régime : la méthode Commons ?                                                            LtoString   public String toStrin...
Régime : la méthode Commons ?                                                              Lequals   public boolean equals...
Régime : la méthode Commons ?                                                     LhashCode   public int hashCode() {     ...
Régime : la méthode Commons ?                                                                 LcompareTo   public int comp...
Fonctionnal prog Vs boucle for : quand ?Transformation             List<SuperChien> superChiens = newArrayList(           ...
Créer des Maps          public static final ImmutableMap<String, Integer>of            AGES = ImmutableMap.of("Milou", 32,...
CharsetsJava 5   String name = "Milou";         try {           byte[] bytes = name.getBytes("UTF-8");         } catch (Un...
Converter Spring                                                            G    import org.springframework...Converter;  ...
Orderings7
Licences     Lombok :      MIT License     Lombok-pg :   MIT License     Guava :       Apache License 2.0     Commons ...
Extension avec valeurs                                                                    L@ExtensionMethod({ Object.class...
Extension avec valeurs    @ExtensionMethod({ Object.class, MyOtherClass.class })    public class DogWithExtension {       ...
< Chrono >           long start = new Date().getTime(); Guava Java 5           foo(); // traitement long (ou pas)         ...
CharMatcher11
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 ;        ...
And, or, in…                                                               GSeconde liste   List<Dog> dogs2 = newArrayList...
And, or, in…And, or, in...                                                                                                ...
Partition, limitPartition   List<List<FullDog>> partition =              Lists.partition(dogs, 4);                        ...
Slides en préparation
I/O      todo
< I/O >Ressources         public void lireJava6(String from) {           InputStream in = null;           try {           ...
< I/O >Java 7     public void lireJava7(String from) {       try(InputStream in = new FileInputStream(from)) {         ......
< I/O >Guava    Todo                     G
Concurrent / future                      todo
Todo
Upcoming SlideShare
Loading in …5
×

Milou fait un régime Guava Lombok

1,489 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,489
On SlideShare
0
From Embeds
0
Number of Embeds
160
Actions
Shares
0
Downloads
20
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Milou fait un régime Guava Lombok

  1. 1. Milou fait un régime Guava - Lombok
  2. 2. SPONSORS
  3. 3. @thierryleriche Thierry Leriche-Dessirier  Consultant JEE freelance  Professeur de Génie Logiciel à l’ESIEA  Rédacteur pour Programmez  Rédacteur pour Developpez.comicauda.com
  4. 4. Cours ForumsFAQ NewsInterviews CritiquesArticles / tutoriels AgendasMagazine
  5. 5. 13 OOO OOO pages vues par mois5 500 000 visites par mois2 500 000 visites uniques par mois5 000 messages forum par jour
  6. 6.  Milou est trop lourd (intro)Agenda  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. 5DOG public class Dog { private Integer id ; private String name ; private String fullName ; private SexeEnum sex ; private Date birthday ; private String race ; private Boolean lof ; private Double weight ; private Double size ; private List<String> colors ; ...
  9. 9.  Constructeurs  Getters / setters  toString ()  equals ()  hashCode ()  compareTo () id name fullName sex birthday race lof weight size Colors
  10. 10.  Constructeurs  Getters / setters  toString ()  equals ()  hashCode ()  compareTo () id name clic clic fullName démo sex birthday race lof weight size Colors
  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  210 lignes id name fullName sex birthday race lof weight size Colors
  13. 13. 10 attributsJava 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 5 + ", sex=" + sex + ", birthday=" + birthday + ", race=" + race + ", lof=" + lof + ", weight=" + weight + ", size=" + size + ", colors=" + colors + "]"; } 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) 5 .append(", name=").append(name) .append(", fullName=").append(fullName) ... .append(", colors=").append(colors); return sb.toString(); } Mieux mais sans plus   toString ()
  18. 18. Guava public String toString() { return Objects.toStringHelper(this) .add("id", id) .add("name", name) G .add("fullName", fullName) ... .add("colors", colors) .toString(); } Builder  toString ()
  19. 19. birthday, fullname, name, race et sexJava 5 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. birthday, fullname, name, race et sexGuava 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. birthday, fullname, name, race et sexJava 5 public int hashCode() { final int prime = 31; int result = 1; result = prime * result 5 + ((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 ()
  22. 22. birthday, fullname, name, race et sexGuava public int hashCode() { } return Objects.hashCode(birthday, fullName, name, race, sex); G  hasCode()
  23. 23. name, fullname, birthday, weight, size, race et sexJava 5 public int compareTo(Dog other) { int result = 0; result = name.compareTo(other.name); if (result != 0) { 5 return result; } result = fullname.compareTo(other.fullname); if (result != 0) { return result; } ... }  compareTo ()
  24. 24. name.compareTo(other.name) Vsother.name.compareTo(name) compareTo ()
  25. 25. name, fullname, birthday, weight, size, race et sexGuava public int compareTo(Dog other) { return ComparisonChain.start() .compare(name, other.name) .compare(fullName, other.fullName) .compare(birthday, other.birthday) G .compare(weight, other.weight) .compare(size, other.size) .compare(race, other.race) .compare(sex, other.sex) .result(); }  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  @NoArgsConstructor / @RequiredArgsConstructor / @AllArgsConstructor  @Getter / @Setter  @ToString  @EqualsAndHashCode  @Data clic clic démo
  30. 30. 10 attributs Java 210 lignes de codeLombok 12 lignes + 2-3 @ + compareTo()
  31. 31. Factory @RequiredArgsConstructor(staticName = "of") public class Dog { private Integer id; @NonNull private String name;  L private String fullName; @NonNull private SexeEnum sex;  private Date birthday; ... name, sex  Dog dog = Dog.of("Milou", MALE);
  32. 32. Factory @RequiredArgsConstructor(staticName = "of") public class Dog { private Integer id; @NonNull private String name;  L private String fullName; @NonNull private SexeEnum sex;  private Date birthday; ... name, sex  Dog dog = Dog.of("Milou", MALE); 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]; 5 while (true) { int r = in.read(b); if (r == -1) break; ... } } catch (Exception e) { ... } finally { if (in != null) { try { in.close(); } catch (Exception e) { ... } } ...
  36. 36. Ressources public void lire(String from) throws IOException { @Cleanup InputStream in = new FileInputStream(from); byte[] b = new byte[10000]; L while (true) { int r = in.read(b); if (r == -1) break; ... } }
  37. 37. Délombok Revenir sans la lib
  38. 38. java -jar lombok.jar delombok src -d src-delombokedDélombok <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 @Data public class Dog { 5 5 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; mvn if (o == null) return false; lombok:delombok if (o.getClass() != this.getClass()) ret final Dog other = (Dog)o; if (this.getId() == null ? other.getId() ... @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  @Action  @Builder  @Function  @LazyGetter  @EnumId  @FluentSetter  @Rethrow / @Rethrows  @Predicate  @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 ; L private String name ; private String fullName ; ...  DogLombok dog = new DogLombok(); dog.name("Milou").sex(MALE); println( dog.getName()); //  Milou println( dog.getSex()); //  MALE
  43. 43. Builder @Builder @Getter public class Dog { private Integer id ; L private String name ; private String fullName ; ...  Dog dog = Dog.dog().name("Milou").sex(MALE).build(); println( dog.getName()); //  Milou println( dog.getSex()); //  MALE
  44. 44. extension @ExtensionMethod({ Dog.class, MyDogExtensionClass.class }) public class DogWithExtension { public void foo() { Dog milou = new Dog("Milou", 12.5, ...); L 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. < new Vs static factories >Java 5 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 List<Integer> primeNumbers = new ArrayList<Integer>(); Set<String> colors = new TreeSet<String>(); Map<String, Integer> ages = new HashMap<String, Integer>(); 5 5dur dur ? Map<String, List<String>> trucs = new HashMap<String, List<String>>(); 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. < new Vs static factories >Java 5 List<Integer> primeNumbers = new ArrayList<Integer>(); Set<String> colors = new TreeSet<String>(); Map<String, Integer> ages = new HashMap<String, Integer>(); 5 7Java 7 List<Integer> primeNumbers = new ArrayList<>(); Set<String> colors = new TreeSet<>(); Map<String, Integer> ages = new HashMap<>(); Qui utilise Java 7 en prod ?
  52. 52. < new Vs static factories >Java 5 List<Integer> primeNumbers = new ArrayList<Integer>(); Set<String> colors = new TreeSet<String>(); Map<String, Integer> ages = new HashMap<String, Integer>(); 5 7Java 7 List<Integer> primeNumbers = new ArrayList<>(); Set<String> colors = new TreeSet<>(); Map<String, Integer> ages = new HashMap<>(); Qui utilise Java 7 en prod ? GGuava List<Integer> primeNumbers = newArrayList(); Set<String> colors = newTreeSet(); Map<String, Integer> ages = newHashMap(); Dès maintenant !
  53. 53. < new Vs static factories >Java 5 List<Integer> primeNumbers = new ArrayList<Integer>(); Set<String> colors = new TreeSet<String>(); Map<String, Integer> ages = new HashMap<String, Integer>(); 5 7Java 7 List<Integer> primeNumbers = new ArrayList<>(); Set<String> colors = new TreeSet<>(); Map<String, Integer> ages = new HashMap<>(); Qui utilise Java 7 en prod ? GGuava List<Integer> primeNumbers = newArrayList(); Set<String> colors = newTreeSet(); Map<String, Integer> ages = newHashMap(); Dès maintenant ! Lombok var primeNumbers = new ArrayList<Integer>(); -> primeNumbers.size(); ... L
  54. 54. < new Vs static factories > GList of dogs 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]
  55. 55. Immutables Pour que ça ne change pas
  56. 56. immutableQuand ?
  57. 57. immutable Quand ? mutableOn se demande souvent si une liste doit être immutable maisc’est prendre le problème dans le mauvais sens. La plupart dutemps, ce qu’il faut vraiment se demander, c’est si la liste abesoin d’être mutable.
  58. 58. < unmodifiables Vs immutables >Java 5 Set<Integer> temp = new LinkedHashSet<Integer>(Arrays.asList(1, 2, 3, 5, 7)); Set<Integer> primes = Collections.unmodifiableSet(temp);
  59. 59. < unmodifiables Vs immutables >Java 5 Set<Integer> temp = new LinkedHashSet<Integer>(Arrays.asList(1, 2, 3, 5, 7)); Set<Integer> primes = Collections.unmodifiableSet(temp); GGuava Set<Integer> primes = ImmutableSet.of(1, 2, 3, 5, 7);
  60. 60. < unmodifiables Vs immutables >Of ImmutableSet.of(E ImmutableSet.of(E ImmutableSet.of(E ImmutableSet.of(E ImmutableSet.of(E e1) e1, e1, e1, e1, E E E E e2) e2, e2, e2, E E E e3) e3, E e4) e3, E e4, E e5) G ImmutableSet.of(E e1, E e2, E e3, E e4, E e5, E e6, E...) Ne prend pas de nullOf ImmutableSet.of() Vide Map et List  FAQ 4  http://blog.developpez.com/guava/p10589/collection/title-212/
  61. 61. < Copie de défense >Java 5 public class Dog { private String name; ... private List<String> colors; 5 public Dog(String name, List<String> colors) { this.name = name; ... this.colors = Collections.unmodifiableList( new ArrayList<String>(colors)); } public List<String> getColors() { return colors; }
  62. 62. < Copie de défense >Guava public class Dog { private String name; ... private ImmutableList<String> colors; G public Dog(String name, List<String> colors) { this.name = name; ... this.colors = ImmutableList.copyOf(colors); } public ImmutableList<String> getColors() { return colors; } Message clair
  63. 63. Collections en plus Multimap, Bipap, Multiset
  64. 64. < Multi Map >Java 5 Map<String, List<String>> dogFavoriteColors = new HashMap<String, List<String>>(); 5 } milouColors = new ArrayList<String>(); dogFavoriteColors.put("Milou",milouColors); 5 List<String> milouColors = dogFavoriteColors.get("Milou"); if(milouColors == null) { milouColors.add("Vert");
  65. 65. < Multi Map >Java 5 Map<String, List<String>> dogFavoriteColors = new HashMap<String, List<String>>(); 5 } milouColors = new ArrayList<String>(); dogFavoriteColors.put("Milou",milouColors); 5 List<String> milouColors = dogFavoriteColors.get("Milou"); if(milouColors == null) { milouColors.add("Vert"); GGuava Multimap<String, String> dogFavoriteColors = HashMultimap.create(); dogFvoriteColors2.put("Milou", "Jaune"); dogFavoriteColors2.put("Milou", "Rouge");
  66. 66. < Bi Map > GGuava 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, ABC123=Milou println( tatouages.inverse() ); Une map bijective JFT672=Lassie} {Milou=ABC123, MDB324=Volt Volt=MBD324, Lassie=JFT672} JFT672=Lassie Il est possible de changer la valeur associée à une clé mais pas davoir deux clés avec la même valeur (IllegalArgumentException).
  67. 67. < Multi Set >Guava G 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
  68. 68. BasePréconditions, joiner, splitter, optional
  69. 69.  toString () equals () hashCode () compareTo ()
  70. 70. < Preconditions >DOG public class Dog { private Integer private String private String id ; name ; fullName ; 5 ... 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; ... }
  71. 71. < Preconditions >DOG G import static com.google.common.base.Preconditions.*; public class Dog { private Integer id ; private String name ; private String fullName ; ... 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  String names = Joiner.on(", ") .skipNulls() .join(newArrayList("Lassie", "Volt", null, "Milou")); "Lassie, Volt, Milou" G
  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  String names = Joiner.on(", ") .skipNulls() .join(newArrayList("Lassie", "Volt", null, "Milou")); "Lassie, Volt, Milou" G G 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(",") [ "Lassie", .split("Lassie, Volt, Milou"); "Volt", "Milou" ]
  77. 77. Splitter Iterable<String> dogNames = Splitter.on(",") [ "Lassie", .split("Lassie, Volt, Milou"); "Volt", "Milou" ] Iterable<String> dogNames = Splitter.on(",") [ "Lassie", .split("Lassie, Volt, ,Milou"); "Volt", " ", "Milou" ]
  78. 78. Splitter Iterable<String> dogNames = Splitter.on(",") [ "Lassie", .split("Lassie, Volt, Milou"); "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(",") [ "Lassie", .split("Lassie, Volt, Milou"); "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() .omitEmptyStrings() [ "Lassie", .split("Lassie, Volt, ,Milou"); "Volt", "Milou" ] G  http://blog.developpez.com/guava/p11045/annotation/splitter-pour-separer-des-items/
  80. 80. Wrapper Optional <T>Optional Dog dog = new Dog("Milou", ...); Optional<Dog> opt = Optional.of(dog); assertTrue( opt.isPresent() ); assertEquals( "Milou", opt.get().getName() );
  81. 81. Wrapper Optional <T>Optional 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. Wrapper Optional <T>Optional 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. Wrapper Optional <T>Optional 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 chienDog
  86. 86. Super Chien public class SuperChien implements SuperHero { private private private String double Set<String> surnom ; poids ; couleursCostume ; 5 private Set<String> pouvoirs ; ... 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, @Override new Function<Dog, SuperChien>() { public SuperChien apply(Dog dog) { G SuperChien chien = new SuperChien(); 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 G List<SuperChien> superChiens = Lists.transform(dogs, new Function<Dog, SuperChien>() { @Override public SuperChien apply(Dog dog) { SuperChien chien = new SuperChien(); ... return chien; } });  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 Predicate<Dog> malePredicate = new Predicate<Dog>() { public boolean apply(Dog dog) { } return dog.getSex() == MALE; G } Iterable<Dog> maleDogs = Iterables.filter(dogs, malePredicate); [Milou, Rintintin, G Volt, Pluto, Medor]
  90. 90. < Filtre >Filtre Predicate<Dog> malePredicate = new Predicate<Dog>() { public boolean apply(Dog dog) { } return dog.getSex() == MALE; [Milou, G } Rintintin, Volt, Iterable<Dog> maleDogs = Iterables.filter(dogs, malePredicate); Pluto, Medor] G Dog firstMaleDog = Iterables.find(dogs, malePredicate); Milou G
  91. 91. < Filtre >Filtre Predicate<Dog> malePredicate = new Predicate<Dog>() { public boolean apply(Dog dog) { } return dog.getSex() == MALE; [Milou, G } Rintintin, Volt, Iterable<Dog> maleDogs = Iterables.filter(dogs, malePredicate); Pluto, Medor] G Dog firstMaleDog = Iterables.find(dogs, malePredicate); Milou G Dog firstMaleDog = Iterables.find(femaleDogs, malePredicate, DEFAULT_DOG ); Default dog
  92. 92. < Fluent or not fluent ? >Pas fluent Predicate<Dog> malePredicate = new Predicate<Dog>() { public boolean apply(Dog dog) { return dog.getSex() == MALE; }}; G Function<FullDog, String> nameFunction = new Function<FullDog, String>() { public String apply(FullDog dog) { return dog.getName(); }}; G G Iterable<FullDog> maleDogs = Iterables.filter(dogs, malePredicate); Iterable<String> maleNames = Iterables.transform(maleDogs, nameFunction); [Milou, Rintintin, Volt, Pluto, Medor]
  93. 93. < Fluent or not fluent ? >Pas fluent Iterable<FullDog> maleDogs = Iterables.filter(dogs, malePredicate); Iterable<String> maleNames = Iterables.transform(maleDogs, nameFunction); G GFluent List<String> maleNames2 = FluentIterable.from(dogs) .filter(malePredicate) .transform(nameFunction) .toImmutableList(); Guava 12.0 [Milou, Rintintin, Volt, Pluto,  http://blog.developpez.com/guava/p11092/annotation/fluentiterable-sur- Medor] mon-chien-guava/
  94. 94. Cache todo
  95. 95. < Memoization >Web Service public class DogService { @Inject private PetShopWebService service; public Integer getNumberDogsSoldYesterday() { 5 return service.checkSales( "dog" ); }
  96. 96. < Memoization >Web Service public class DogService { @Inject private PetShopWebService service; public Integer getNumberDogsSoldYesterday() { 5 return service.checkSales( "dog" ); } 5Cache manuel private Integer nbOfDogsSold; public Integer getNumberDogsSoldYesterday() { if (nbOfDogsSold == null) { nbOfDogsSold = service.checkSales( "dog" ); } return nbOfDogsSold; } Double check null…
  97. 97. < Memoization >Guava public class DogService { @Inject private PetShopWebService service; private Supplier<Integer> nbOfDogsSoldSupplier = G Suppliers.memoize( new Supplier<Integer>() { public Integer get() { return service.checkSales( "dog" ); } }); public Integer getNumberDogsSoldYesterday() { return nbOfDogsSoldSupplier.get(); }
  98. 98. < Memoization >Guava public class DogService { @Inject private PetShopWebService service; private Supplier<Integer> nbOfDogsSoldSupplier = G Suppliers.memoizeWithExpiration( new Supplier<Integer>() { public Integer get() { return service.checkSales( "dog" ); } }, 1, TimeUnit.DAYS ); public Integer getNumberDogsSoldYesterday() { return nbOfDogsSoldSupplier.get(); }
  99. 99. < Cache >Web Service 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 ?
  100. 100. < Cache >Guava public class DogService { @Inject private PetShopWebService service; private LoadingCache<String, Dog> dogCache = G 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 }
  101. 101. Hash Fantôme
  102. 102. Hash HashFunction hf = Hashing.md5(); HashCode hc = hf.newHasher() .putInt(123) .putString("Milou") G .hash(); byte[] bytes = hc.asBytes();  md5  Murmur3 128 bits  Murmur3 32 bits  Sha1  Sha256  Sha512  goodFastHash
  103. 103. < Is in list ? >Préparation int NB_OF_DOGS = 100000; List<Dog> dogs = newArrayList(); Random rand = new Random(); for (int i = 0; i < NB_OF_DOGS; i++) { 5 Dog dog = new Dog(); dog.setName("abc" + rand.nextInt(999)); ... dogs.add(dog); } 5contains final Dog milou = new Dog(); milou.setName("Milou"); ... boolean isInList = dogs.contains(milou); false (14 ms) dogs.add(milou); boolean isInList = dogs.contains(milou); true (14 ms)
  104. 104. < Is in list ? >Bloom filter 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/
  105. 105. Guava or not Guava ? Avantages et inconvénients
  106. 106. Pro / Cons  Ne pas en abuser…  Utile  Bonnes pratiques
  107. 107. LIENS @thierryleriche
  108. 108. Guava http://code.google.com/p/guava-librariesLombok http://projectlombok.orgLombok-pg https://github.com/peichhorn/lombok-pg
  109. 109. ICAUDA http://icauda.com http://icauda.com/articles.html (articles) http://icauda.com/cours.html (slides)Blog Guava http://blog.developpez.com/guava« Simplifier le code de vos beans Java à laidede Commons Lang, Guava et Lombok » http://thierry-leriche-dessirier.developpez.com/tutoriels/ java/simplifier-code-guava-lombok (article)
  110. 110. MERCI
  111. 111. 1. Guava Vs CommonsFAQ / Bonus 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
  112. 112. Guava Vs Commons ? http://tinyurl.com/guava-vs-apache1
  113. 113. Régime : la méthode Commons ? LtoString public String toString() { return new ToStringBuilder(this) .append("id", id) .append("name", name) .append("fullName", fullName) ... .append("colors", colors) .toString(); }2
  114. 114. Régime : la méthode Commons ? Lequals 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
  115. 115. Régime : la méthode Commons ? LhashCode public int hashCode() { return new HashCodeBuilder(17, 37) .append(birthday) .append(fullname) .append(name) .append(race) .append(sex) .toHashCode(); }2
  116. 116. Régime : la méthode Commons ? LcompareTo 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
  117. 117. Fonctionnal prog Vs boucle for : quand ?Transformation List<SuperChien> superChiens = newArrayList( Lists.transform(dogs, new Function<Dog, SuperChien>() { @Override public SuperChien apply(Dog dog) { SuperChien chien = new SuperChien(); ... })); } return chien; G Vs List<SuperChien> superChiens = newArrayList(); 3 for(Dog dog : dogs) { SuperChien chien = new SuperChien(); } ... superChiens.add(chien); G http://code.google.com/p/guava-libraries/wiki/FunctionalExplained
  118. 118. Créer des Maps public static final ImmutableMap<String, Integer>of AGES = ImmutableMap.of("Milou", 32, G "Volt", 7, "Pluto", 37, "Lassie", 17); public static final ImmutableMap<String, Integer>Builder AGES = new ImmutableMap.Builder<String, Integer>() .put("Milou", 32) .put("Volt", 7) .put("Pluto", 37) .put("Lassie", 17)4 .put("Medor", 5) .put("Croquette", 8) G .put("Loulou", 2) ... .build();
  119. 119. CharsetsJava 5 String name = "Milou"; try { byte[] bytes = name.getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { 5 throw new AssertionError(e); } Ca n’arrive jamais cette exception  GGuava String name = "Milou"; byte[] bytes = name.getBytes(Charsets.UTF_8);5
  120. 120. Converter Spring G import org.springframework...Converter; @Component("dogToChienConverter") public class DogToChienConverter implements Converter<List<Dog>, List<SuperChien>> { 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;6 } Lazy or not lazy ?
  121. 121. Orderings7
  122. 122. Licences  Lombok : MIT License  Lombok-pg : MIT License  Guava : Apache License 2.0  Commons : Apache License 2.08
  123. 123. Extension avec valeurs L@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.
  124. 124. Extension avec valeurs @ExtensionMethod({ Object.class, MyOtherClass.class }) public class DogWithExtension { public void foo() { String s1 = "toto"; L s1.print(); //  toto String s2 = null; s2.print(); //  null s2.print("vide"); //  vide } } class MyOtherClass { public static <T> void print(final T value) { System.out.println(value);9 } public static void print(String value, String other) { if (value == null || value.isEmpty()) { System.out.println(other); } else { System.out.println(value); }
  125. 125. < Chrono > long start = new Date().getTime(); Guava Java 5 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(); G long duration = sw.elapsedMillis(); // 11 ms10 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/
  126. 126. CharMatcher11
  127. 127. Impl public class Dog implements Comparable<Dog> { private Integer id ; private String name ; private String fullName ; 5 ... @Override public int compareTo(Dog dog) { return ...; } implements List ? aie aie aie12
  128. 128. Impl @AutoGenMethodStub public class Dog implements Comparable<Dog> { private Integer id ; private String name ; L private String fullName ; ...12
  129. 129. And, or, in… GSeconde liste List<Dog> dogs2 = newArrayList( new Dog("Rintintin", 45.0, MALE, ...), new Dog("Pluto", 22.0, MALE, ...), new Dog("Lulu", 35.6, MALE, ...)); [Rintintin, [Milou, Pluto, Rintintin,13 Lulu] Volt, Liste 2 : dogs2 Lassie, Pluto, Medor] Liste 1 : dogs
  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; boolean isTintinInOne = or( in(dogs), in(dogs2) ) .apply(new Dog("Tintin"); false13 [Milou, Rintintin, Liste 2 : dogs2 Liste 1 : dogs Volt, Lassie, [Rintintin, Pluto, Pluto, Medor] Lulu]
  131. 131. Partition, limitPartition List<List<FullDog>> partition = Lists.partition(dogs, 4); [Milou, [Pluto, G Rintintin, Medor] Volt, Lassie] GLimit List<FullDog> first4Dogs = newArrayList(Iterables.limit(dogs, 4)); [Milou,14 Rintintin, Volt, Lassie]
  132. 132. Slides en préparation
  133. 133. I/O todo
  134. 134. < I/O >Ressources public void lireJava6(String from) { InputStream in = null; try { in = new FileInputStream(from); byte[] b = new byte[10000]; 5 while (true) { int r = in.read(b); if (r == -1) break; ... } } catch (Exception e) { ... } finally { if (in != null) { try { in.close(); } catch (Exception e) { ... } } ...
  135. 135. < I/O >Java 7 public void lireJava7(String from) { try(InputStream in = new FileInputStream(from)) { ... while (true) { ... 7 } } }
  136. 136. < I/O >Guava Todo G
  137. 137. Concurrent / future todo
  138. 138. Todo

×