Advertisement
MrPolywhirl

Filtering jdk7 vs Apache vs Guava vs jdk8

Oct 7th, 2014
374
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.28 KB | None | 0 0
  1. //DEFINE BradyBunch.java {CLASS}
  2.  
  3. package org.gradle;
  4.  
  5. import java.util.ArrayList;
  6. import java.util.Collection;
  7. import java.util.Iterator;
  8. import java.util.List;
  9. import java.util.stream.Collectors;
  10.  
  11. import org.apache.commons.collections.CollectionUtils;
  12.  
  13. import com.google.common.base.Joiner;
  14. import com.google.common.base.Strings;
  15. import com.google.common.collect.Collections2;
  16. import com.google.common.collect.Lists;
  17.  
  18. public class BradyBunch {
  19.  
  20.     ////////////////////////////////////////////////////////////////////////////
  21.     // Native JDK 7 Filtering                                                 //
  22.     ////////////////////////////////////////////////////////////////////////////
  23.  
  24.     /**
  25.      * Native JDK 7 predicate for filtering.
  26.      *
  27.      * @param <T>
  28.      *
  29.      * @see org.gradle.BradyBunch#filter1(List)
  30.      */
  31.     public static interface NativePredicate<T> {
  32.         public boolean filter(T t);
  33.     }
  34.  
  35.     /**
  36.      * Native JDK 7 filtering for collections.
  37.      *
  38.      * @see org.gradle.BradyBunch#filter1(List)
  39.      */
  40.     public static final class NativeFilter {
  41.         public static <T> Collection<T> filter(Collection<T> col,
  42.                 NativePredicate<T> predicate) {
  43.             Collection<T> copy = new ArrayList<T>();
  44.             for (Iterator<T> i = col.iterator(); i.hasNext();) {
  45.                 T obj = i.next();
  46.                 if (predicate.filter(obj)) {
  47.                     copy.add(obj);
  48.                 }
  49.             }
  50.             return copy;
  51.         }
  52.     }
  53.  
  54.     ////////////////////////////////////////////////////////////////////////////
  55.     // Predicates                                                             //
  56.     ////////////////////////////////////////////////////////////////////////////
  57.  
  58.     /**
  59.      * @see org.gradle.BradyBunch#filter2(List)
  60.      */
  61.     private static final NativePredicate<Actor> IS_MALE_JDK7
  62.     = new NativePredicate<Actor>() {
  63.         @Override
  64.         public boolean filter(Actor actor) {
  65.             return actor.getGender() == Gender.MALE;
  66.         };
  67.     };
  68.  
  69.     /**
  70.      * @see org.gradle.BradyBunch#filter3(List)
  71.      */
  72.     private static final org.apache.commons.collections.Predicate IS_MALE_APACHE
  73.     = new org.apache.commons.collections.Predicate() {
  74.         @Override
  75.         public boolean evaluate(Object actor) {
  76.             return ((Actor) actor).getGender() == Gender.MALE;
  77.         }
  78.     };
  79.  
  80.     /**
  81.      * @see org.gradle.BradyBunch#filter4(List)
  82.      */
  83.     private static final com.google.common.base.Predicate<Actor> IS_MALE_GUAVA
  84.     = new com.google.common.base.Predicate<Actor>() {
  85.         @Override
  86.         public boolean apply(Actor actor) {
  87.             return actor.getGender() == Gender.MALE;
  88.         }
  89.     };
  90.  
  91.     /**
  92.      * @see org.gradle.BradyBunch#filter5(List)
  93.      */
  94.     private static final java.util.function.Predicate<Actor> IS_MALE_JDK8
  95.     = new java.util.function.Predicate<Actor>() {
  96.         @Override
  97.         public boolean test(Actor actor) {
  98.             return actor.getGender().equals(Gender.MALE);
  99.         }
  100.     };
  101.  
  102.     ////////////////////////////////////////////////////////////////////////////
  103.     // Filter functions                                                       //
  104.     ////////////////////////////////////////////////////////////////////////////
  105.  
  106.     /**
  107.      * Native JDK 7 filtering.
  108.      *
  109.      * @param actors
  110.      *
  111.      * @see org.gradle.BradyBunch.NativeFilter#filter(Collection,NativePredicate)
  112.      * @see org.gradle.BradyBunch.NativePredicate
  113.      */
  114.     private static List<Actor> filter1(List<Actor> actors) {
  115.         return Lists.newArrayList(
  116.                 NativeFilter.filter(actors, IS_MALE_JDK7));
  117.     }
  118.  
  119.     /**
  120.      * Commons-Collections filtering.
  121.      *
  122.      * @param actors
  123.      *
  124.      * @see org.apache.commons.collections.CollectionUtils#filter(Collection,Predicate)
  125.      * @see org.apache.commons.collections.Predicate
  126.      */
  127.     private static List<Actor> filter2(List<Actor> actors) {
  128.         CollectionUtils.filter(actors, IS_MALE_APACHE);
  129.         return Lists.newArrayList(actors);
  130.     }
  131.  
  132.     /**
  133.      * Guava filtering.
  134.      *
  135.      * @param actors
  136.      *
  137.      * @see com.google.common.collect.Collections2#filter(Collection,Predicate)
  138.      * @see com.google.common.base.Predicate
  139.      */
  140.     private static List<Actor> filter3(List<Actor> actors) {
  141.         return Lists.newArrayList(
  142.                 Collections2.filter(actors, IS_MALE_GUAVA));
  143.     }
  144.  
  145.     /**
  146.      * JDK 8 filtering with predefined predicate.
  147.      *
  148.      * @param actors
  149.      *
  150.      * @see java.util.stream.Stream#filter()
  151.      * @see java.util.function.Predicate
  152.      */
  153.     private static List<Actor> filter4(List<Actor> actors) {
  154.         return actors.stream().filter(IS_MALE_JDK8)
  155.                 .collect(Collectors.toList());
  156.     }
  157.  
  158.     /**
  159.      * JDK 8 filtering with lambda predicate.
  160.      *
  161.      * @inherit {@link org.gradle.BradyBunch#filter3(List)}
  162.      * @param actors
  163.      */
  164.     private static List<Actor> filter5(List<Actor> actors) {
  165.         return actors.stream()
  166.                 .filter(a -> a.getGender().equals(Gender.MALE))
  167.                 .collect(Collectors.toList());
  168.     }
  169.  
  170.     ////////////////////////////////////////////////////////////////////////////
  171.     // Utilities                                                              //
  172.     ////////////////////////////////////////////////////////////////////////////
  173.  
  174.     /**
  175.      * Print a generic list with line-feeds as a separator.
  176.      *
  177.      * @param list
  178.      */
  179.     private static final <T> String listToString(List<T> list) {
  180.         return Joiner.on("\n").join(list);
  181.     }
  182.  
  183.     private static final <T> void printList(String label, List<T> list) {
  184.         String border = Strings.repeat("-", 60) + "\n";
  185.         System.out.printf("%2$s| %1$-56s |%n%2$s%3$s%n",
  186.                 label, border, listToString(list));
  187.     }
  188.  
  189.     ////////////////////////////////////////////////////////////////////////////
  190.     // Main driver                                                            //
  191.     ////////////////////////////////////////////////////////////////////////////
  192.  
  193.     /**
  194.      * Main program, run 5 different filters to retrieve the same result.
  195.      */
  196.     public static void main(String[] args) {
  197.         final List<Actor> cast = Lists.newArrayList(
  198.             new TelevisionCharacter("Alice Nelson", "Ann B. Davis",       Gender.FEMALE, "1926-05-26"),
  199.             new TelevisionCharacter("Carol Brady",  "Florence Henderson", Gender.FEMALE, "1934-02-14"),
  200.             new TelevisionCharacter("Marcia Brady", "Maureen McCormick",  Gender.FEMALE, "1956-08-05"),
  201.             new TelevisionCharacter("Cindy Brady",  "Susan Olsen",        Gender.FEMALE, "1961-08-14"),
  202.             new TelevisionCharacter("Jan Brady",    "Eve Plumb",          Gender.FEMALE, "1958-04-29"),
  203.             new TelevisionCharacter("Mike Brady",   "Robert Reed",        Gender.MALE,   "1932-10-19"),
  204.             new TelevisionCharacter("Greg Brady",   "Barry Williams",     Gender.MALE,   "1954-09-30"),
  205.             new TelevisionCharacter("Bobby Brady",  "Mike Lookinland",    Gender.MALE,   "1960-12-19"),
  206.             new TelevisionCharacter("Peter Brady",  "Christopher Knight", Gender.MALE,   "1957-11-07")
  207.         );
  208.  
  209.         printList("JDK 7",                      filter1(cast));
  210.         printList("Apache Commons Collections", filter2(cast));
  211.         printList("Google Guava",               filter3(cast));
  212.         printList("JDK 8 (Predicate)",          filter4(cast));
  213.         printList("JDK 8 (Lambda)",             filter5(cast));
  214.     }
  215. }
  216.  
  217. //DEFINE TelevisionCharacter.java {CLASS}
  218.  
  219. public class TelevisionCharacter extends Actor {
  220.     private static final long serialVersionUID = 1068632925831570873L;
  221.  
  222.     private String roleName;
  223.  
  224.     public TelevisionCharacter() {
  225.         super();
  226.  
  227.         this.roleName = "";
  228.     }
  229.  
  230.     public TelevisionCharacter(String roleName, String name, Gender gender,
  231.             String dateOfBirth) {
  232.         super(name, gender, dateOfBirth);
  233.  
  234.         this.roleName = roleName;
  235.     }
  236.  
  237.     public String getRoleName() {
  238.         return roleName;
  239.     }
  240.  
  241.     public void setRoleName(String roleName) {
  242.         this.roleName = roleName;
  243.     }
  244.  
  245.     @Override
  246.     public String toString() {
  247.         return String.format("%s - %s", roleName, super.toString());
  248.     }
  249. }
  250.  
  251. //DEFINE Actor.java {CLASS}
  252.  
  253. import java.io.Serializable;
  254. import java.time.LocalDate;
  255. import java.time.format.DateTimeFormatter;
  256.  
  257. public class Actor implements Serializable {
  258.     private static final long serialVersionUID = -2512991451114066180L;
  259.  
  260.     private static final String dateFormat = "yyyy-MM-dd";
  261.     private static final DateTimeFormatter dobFrmt = DateTimeFormatter.ofPattern(dateFormat);
  262.  
  263.     private String name;
  264.     private Gender gender;
  265.     private LocalDate dateOfBirth;
  266.  
  267.     public Actor() {
  268.         this("", Gender.UNKNOWN, null);
  269.     }
  270.  
  271.     public Actor(String name, Gender gender, String dateOfBirth) {
  272.         this.name = name;
  273.         this.gender = gender;
  274.         this.setDateOfBirth(LocalDate.parse(dateOfBirth, dobFrmt));
  275.     }
  276.  
  277.     public String getName() {
  278.         return name;
  279.     }
  280.  
  281.     public Actor setName(String name) {
  282.         this.name = name;
  283.         return this;
  284.     }
  285.  
  286.     public Gender getGender() {
  287.         return gender;
  288.     }
  289.  
  290.     public Actor setGender(Gender gender) {
  291.         this.gender = gender;
  292.         return this;
  293.     }
  294.  
  295.     public LocalDate getDateOfBirth() {
  296.         return dateOfBirth;
  297.     }
  298.  
  299.     public void setDateOfBirth(LocalDate dateOfBirth) {
  300.         this.dateOfBirth = dateOfBirth;
  301.     }
  302.  
  303.     @Override
  304.     public String toString() {
  305.         return String.format("%s, %s (%s)", name, gender.getAbbr(), dateOfBirth.format(dobFrmt));
  306.     }
  307. }
  308.  
  309. //DEFINE Gender.javac {ENUM}
  310.  
  311. public enum Gender {
  312.     MALE("M"),
  313.     FEMALE("F"),
  314.     UNKNOWN("?");
  315.  
  316.     private String abbr;
  317.  
  318.     private Gender(String abbr) {
  319.         this.setAbbr(abbr);
  320.     }
  321.  
  322.     public String getAbbr() {
  323.         return abbr;
  324.     }
  325.  
  326.     public void setAbbr(String abbr) {
  327.         this.abbr = abbr;
  328.     }
  329. }
  330.  
  331. ////////////////////////////////////////////////////////////////////////////////
  332. // Program output                                                             //
  333. ////////////////////////////////////////////////////////////////////////////////
  334.  
  335. // ------------------------------------------------------------
  336. // | JDK 7                                                    |
  337. // ------------------------------------------------------------
  338. // Mike Brady - Robert Reed, M (1932-10-19)
  339. // Greg Brady - Barry Williams, M (1954-09-30)
  340. // Bobby Brady - Mike Lookinland, M (1960-12-19)
  341. // Peter Brady - Christopher Knight, M (1957-11-07)
  342. // ------------------------------------------------------------
  343. // | Apache Commons Collections                               |
  344. // ------------------------------------------------------------
  345. // Mike Brady - Robert Reed, M (1932-10-19)
  346. // Greg Brady - Barry Williams, M (1954-09-30)
  347. // Bobby Brady - Mike Lookinland, M (1960-12-19)
  348. // Peter Brady - Christopher Knight, M (1957-11-07)
  349. // ------------------------------------------------------------
  350. // | Google Guava                                             |
  351. // ------------------------------------------------------------
  352. // Mike Brady - Robert Reed, M (1932-10-19)
  353. // Greg Brady - Barry Williams, M (1954-09-30)
  354. // Bobby Brady - Mike Lookinland, M (1960-12-19)
  355. // Peter Brady - Christopher Knight, M (1957-11-07)
  356. // ------------------------------------------------------------
  357. // | JDK 8 (Predicate)                                        |
  358. // ------------------------------------------------------------
  359. // Mike Brady - Robert Reed, M (1932-10-19)
  360. // Greg Brady - Barry Williams, M (1954-09-30)
  361. // Bobby Brady - Mike Lookinland, M (1960-12-19)
  362. // Peter Brady - Christopher Knight, M (1957-11-07)
  363. // ------------------------------------------------------------
  364. // | JDK 8 (Lambda)                                           |
  365. // ------------------------------------------------------------
  366. // Mike Brady - Robert Reed, M (1932-10-19)
  367. // Greg Brady - Barry Williams, M (1954-09-30)
  368. // Bobby Brady - Mike Lookinland, M (1960-12-19)
  369. // Peter Brady - Christopher Knight, M (1957-11-07)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement