Java examples for Lambda Stream:Lambda
Search with Lambda method on object properties
import java.util.List; import java.util.function.Consumer; import java.util.function.Function; import java.util.Comparator; import java.util.function.Predicate; import java.lang.Iterable; import java.time.chrono.IsoChronology; import java.util.List; import java.util.ArrayList; import java.time.chrono.IsoChronology; import java.time.LocalDate; import java.time.temporal.ChronoUnit; import java.time.Period; class Person {// ww w . j a va 2s .c o m public enum Sex { MALE, FEMALE } String name; LocalDate birthday; Sex gender; String emailAddress; Person(String nameArg, LocalDate birthdayArg, Sex genderArg, String emailArg) { name = nameArg; birthday = birthdayArg; gender = genderArg; emailAddress = emailArg; } public int getAge() { return birthday.until(IsoChronology.INSTANCE.dateNow()).getYears(); } public void printPerson() { System.out.println(name + ", " + this.getAge()); } public Sex getGender() { return gender; } public String getName() { return name; } public String getEmailAddress() { return emailAddress; } public LocalDate getBirthday() { return birthday; } public static int compareByAge(Person a, Person b) { return a.birthday.compareTo(b.birthday); } public static List<Person> createRoster() { List<Person> roster = new ArrayList<>(); roster.add(new Person("Fred", IsoChronology.INSTANCE.date(1980, 6, 20), Person.Sex.MALE, "fred@example.com")); roster.add(new Person("Jane", IsoChronology.INSTANCE.date(1990, 7, 15), Person.Sex.FEMALE, "jane@example.com")); roster.add(new Person("George", IsoChronology.INSTANCE.date(1991, 8, 13), Person.Sex.MALE, "george@example.com")); roster.add(new Person("Bob", IsoChronology.INSTANCE.date(2000, 9, 12), Person.Sex.MALE, "bob@example.com")); return roster; } } public class RosterTest { interface CheckPerson { boolean test(Person p); } // Approach 1: Create Methods that Search for Persons that Match One // Characteristic public static void printPersonsOlderThan(List<Person> roster, int age) { for (Person p : roster) { if (p.getAge() >= age) { p.printPerson(); } } } // Approach 2: Create More Generalized Search Methods public static void printPersonsWithinAgeRange(List<Person> roster, int low, int high) { for (Person p : roster) { if (low <= p.getAge() && p.getAge() < high) { p.printPerson(); } } } // Approach 3: Specify Search Criteria Code in a Local Class // Approach 4: Specify Search Criteria Code in an Anonymous Class // Approach 5: Specify Search Criteria Code with a Lambda Expression public static void printPersons(List<Person> roster, CheckPerson tester) { for (Person p : roster) { if (tester.test(p)) { p.printPerson(); } } } // Approach 6: Use Standard Functional Interfaces with Lambda Expressions public static void printPersonsWithPredicate(List<Person> roster, Predicate<Person> tester) { for (Person p : roster) { if (tester.test(p)) { p.printPerson(); } } } // Approach 7: Use Lambda Expressions Throughout Your Application public static void processPersons(List<Person> roster, Predicate<Person> tester, Consumer<Person> block) { for (Person p : roster) { if (tester.test(p)) { block.accept(p); } } } // Approach 7, second example public static void processPersonsWithFunction(List<Person> roster, Predicate<Person> tester, Function<Person, String> mapper, Consumer<String> block) { for (Person p : roster) { if (tester.test(p)) { String data = mapper.apply(p); block.accept(data); } } } // Approach 8: Use Generics More Extensively public static <X, Y> void processElements(Iterable<X> source, Predicate<X> tester, Function<X, Y> mapper, Consumer<Y> block) { for (X p : source) { if (tester.test(p)) { Y data = mapper.apply(p); block.accept(data); } } } public static void main(String... args) { List<Person> roster = Person.createRoster(); for (Person p : roster) { p.printPerson(); } // Approach 1: Create Methods that Search for Persons that Match One // Characteristic System.out.println("Persons older than 20:"); printPersonsOlderThan(roster, 20); System.out.println(); // Approach 2: Create More Generalized Search Methods System.out.println("Persons between the ages of 14 and 30:"); printPersonsWithinAgeRange(roster, 14, 30); System.out.println(); // Approach 3: Specify Search Criteria Code in a Local Class System.out.println("Persons who are eligible for Selective Service:"); class CheckPersonEligibleForSelectiveService implements CheckPerson { public boolean test(Person p) { return p.getGender() == Person.Sex.MALE && p.getAge() >= 18 && p.getAge() <= 25; } } printPersons( roster, new CheckPersonEligibleForSelectiveService()); System.out.println(); // Approach 4: Specify Search Criteria Code in an Anonymous Class System.out.println("Persons who are eligible for Selective Service " + "(anonymous class):"); printPersons( roster, new CheckPerson() { public boolean test(Person p) { return p.getGender() == Person.Sex.MALE && p.getAge() >= 18 && p.getAge() <= 25; } } ); System.out.println(); // Approach 5: Specify Search Criteria Code with a Lambda Expression System.out.println("Persons who are eligible for Selective Service " + "(lambda expression):"); printPersons( roster, (Person p) -> p.getGender() == Person.Sex.MALE && p.getAge() >= 18 && p.getAge() <= 25 ); System.out.println(); // Approach 6: Use Standard Functional Interfaces with Lambda // Expressions System.out.println("Persons who are eligible for Selective Service " + "(with Predicate parameter):"); printPersonsWithPredicate( roster, p -> p.getGender() == Person.Sex.MALE && p.getAge() >= 18 && p.getAge() <= 25 ); System.out.println(); // Approach 7: Use Lamba Expressions Throughout Your Application System.out.println("Persons who are eligible for Selective Service " + "(with Predicate and Consumer parameters):"); processPersons( roster, p -> p.getGender() == Person.Sex.MALE && p.getAge() >= 18 && p.getAge() <= 25, p -> p.printPerson() ); System.out.println(); // Approach 7, second example System.out.println("Persons who are eligible for Selective Service " + "(with Predicate, Function, and Consumer parameters):"); processPersonsWithFunction( roster, p -> p.getGender() == Person.Sex.MALE && p.getAge() >= 18 && p.getAge() <= 25, p -> p.getEmailAddress(), email -> System.out.println(email) ); System.out.println(); // Approach 8: Use Generics More Extensively System.out.println("Persons who are eligible for Selective Service " + "(generic version):"); processElements( roster, p -> p.getGender() == Person.Sex.MALE && p.getAge() >= 18 && p.getAge() <= 25, p -> p.getEmailAddress(), email -> System.out.println(email) ); System.out.println(); // Approach 9: Use Bulk Data Operations That Accept Lambda Expressions // as Parameters System.out.println("Persons who are eligible for Selective Service " + "(with bulk data operations):"); roster .stream() .filter( p -> p.getGender() == Person.Sex.MALE && p.getAge() >= 18 && p.getAge() <= 25) .map(p -> p.getEmailAddress()) .forEach(email -> System.out.println(email)); } } /* * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Oracle or the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */