美文网首页
java Lambda Expressions

java Lambda Expressions

作者: 時間_77c1 | 来源:发表于2018-07-05 16:46 被阅读0次

    Lambda是JDK 1.8新特性,用Lambda代替匿名类,可以使代码更加间接,干练。

    语法规则:(param1, param2,...) ->(return param1+param2); return可以省略
    function interface(函数接口): it contains only one abstract method.
    the JDK defines several standard functional interfaces, which you can find in the package java.util.function.
    lambda Expressions可以和函数接口配合使用,具体demo参考代码

    eg:匿名类和lambda比较

    package lambda;
    
    import java.time.LocalDate;
    import java.util.LinkedList;
    import java.util.List;
    
    /**
     * 
     * @Description:
     * @author: chenlh
     * @date: 2018-07-05
     */
    public class Person {
    
        public enum Sex {
            MALE, FEMALE
        }
    
        String name;
        LocalDate birthday;
        Sex gender;
        String emailAddress;
    
        public int getAge() {
            return 20;
        }
    
        public void printPerson() {
            System.out.println("printPerson");
        }
    
        /**
         * @return
         */
        public static List<Person> createRoster() {
            List p = new LinkedList();
            p.add(new  Person());
            p.add(new  Person());
            p.add(new  Person());
            return p;
        }
    
        /**
         * @return
         */
        public Sex getGender() {
            return Sex.MALE;
        }
    
        /**
         * @return
         */
        public String getEmailAddress() {
            return this.getEmailAddress();
        }
    }
    

    测试类:

    
    package lambda;
    
    
    import java.util.List;
    import java.util.function.Consumer;
    import java.util.function.Function;
    import java.util.function.Predicate;
    
    
    /**
     * 
     * @Description:匿名类和lambda测试比较
     * @author: chenlh
     * @date: 2018-07-05
     */
    public class LambdaTest {
    
        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));
         }
    }
    

    相关文章

      网友评论

          本文标题:java Lambda Expressions

          本文链接:https://www.haomeiwen.com/subject/ambpuftx.html