ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

lamdba初体验

2020-08-17 15:32:06  阅读:181  来源: 互联网

标签:初体验 java lamdba Person crelle test import public


假设我们有一个场景:需要查询指定条件的人员信息,Person类定义了人员属性,Utils生成我们需要的人员名单,下面的例子我们来探讨下,

Person:

package crelle.test.java.other.beans;

import java.time.LocalDate;

/**
 * @author:crelle
 * @className:Person
 * @version:1.0.0
 * @date:2020/8/15
 * @description:XX
 **/
public class Person {

    public enum Sex {
        MALE, FEMALE
    }
    private String name;

    private LocalDate birthday;

    private Sex gender;

    private String emailAddress;

    private int age;

    public void printPerson() {
      System.out.println(toString());
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public LocalDate getBirthday() {
        return birthday;
    }

    public void setBirthday(LocalDate birthday) {
        this.birthday = birthday;
    }

    public Sex getGender() {
        return gender;
    }

    public void setGender(Sex gender) {
        this.gender = gender;
    }

    public String getEmailAddress() {
        return emailAddress;
    }

    public void setEmailAddress(String emailAddress) {
        this.emailAddress = emailAddress;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", birthday=" + birthday +
                ", gender=" + gender +
                ", emailAddress='" + emailAddress + '\'' +
                ", age=" + age +
                '}';
    }
}

Utils:

package crelle.test.java.other;

import crelle.test.java.other.beans.Order;
import crelle.test.java.other.beans.Person;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

/**
 * @author:crelle
 * @className:utils
 * @version:1.0.0
 * @date:2020/8/15
 * @description:XX
 **/
public class Utils {
    public static List<Person> getPersonsLists(){
        List<Person> personList = new ArrayList<Person>();
        Person person1 = new Person();
        person1.setAge(15);
        LocalDate localDate1 = LocalDate.of(2020,4,1);
        person1.setBirthday(localDate1);
        person1.setGender(Person.Sex.MALE);
        person1.setEmailAddress("123@qq.com");
        person1.setName("tom");
        personList.add(person1);

        Person person2 = new Person();
        person2.setAge(17);
        LocalDate localDate2 = LocalDate.of(2020,6,1);
        person2.setBirthday(localDate2);
        person2.setGender(Person.Sex.MALE);
        person2.setEmailAddress("456@qq.com");
        person2.setName("john");
        personList.add(person2);

        Person person3 = new Person();
        person3.setAge(19);
        LocalDate localDate3 = LocalDate.of(2020,8,1);
        person3.setBirthday(localDate3);
        person3.setGender(Person.Sex.FEMALE);
        person3.setEmailAddress("789@qq.com");
        person3.setName("lili");
        personList.add(person3);
        return personList;
    }

}

1、获取年龄为15的人员

方法的入参为人员集合,年龄

package crelle.test.java.util.function.lambdatutorials;

import crelle.test.java.other.Utils;
import crelle.test.java.other.beans.Person;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

/**
 * @author:crelle
 * @className:Approach1
 * @version:1.0.0
 * @date:2020/8/15
 * @description: Create Methods That Search for Members That Match One Characteristic
 **/
public class Approach1 {
    public static void main(String[] args) {
        printPersonsOlderThan(Utils.getPersonsLists(),15);
    }

    public static void printPersonsOlderThan(List<Person> roster, int age) {
        for (Person p : roster) {
            if (p.getAge() >= age) {
                p.printPerson();
            }
        }
    }
}

现在我们想获取年龄在16-25之间的人员

2、获取年龄在16-25之间的人员

方法的入参为人员集合,年龄范围

package crelle.test.java.util.function.lambdatutorials;

import crelle.test.java.other.Utils;
import crelle.test.java.other.beans.Person;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

/**
 * @author:crelle
 * @className:Approach1
 * @version:1.0.0
 * @date:2020/8/15
 * @description: Create More Generalized Search Methods
 **/
public class Approach2 {
    public static void main(String[] args) {

        printPersonsWithinAgeRange(Utils.getPersonsLists(),16,25);
    }

    public static void printPersonsWithinAgeRange(
            List<Person> roster, int low, int high) {
        for (Person p : roster) {
            if (low <= p.getAge() && p.getAge() < high) {
                p.printPerson();
            }
        }
    }
}

我们做一个改进,把查询条件做一个抽取,我们抽取一个接口CheckPerson:

package crelle.test.java.util.function.lambdatutorials;

import crelle.test.java.other.beans.Person;

/**
 * @author:crelle
 * @className:CheckPerson
 * @version:1.0.0
 * @date:2020/8/15
 * @description:XX
 **/
public interface CheckPerson {
    boolean test(Person p);
}

3、查询16-25的男性

方法的入参为人员集合,CheckPerson实现类

package crelle.test.java.util.function.lambdatutorials;

import crelle.test.java.other.Utils;
import crelle.test.java.other.beans.Person;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

/**
 * @author:crelle
 * @className:Approach1
 * @version:1.0.0
 * @date:2020/8/15
 * @description: Specify Search Criteria Code in a Local Class
 **/
public class Approach3 {
    public static void main(String[] args) {
        printPersons(Utils.getPersonsLists(), new CheckPersonEligibleForSelectiveService());
    }


    public static void printPersons(
            List<Person> roster, CheckPerson tester) {
        for (Person p : roster) {
            if (tester.test(p)) {
                p.printPerson();
            }
        }
    }
}


class CheckPersonEligibleForSelectiveService implements CheckPerson {
    public boolean test(Person p) {
        return p.getGender() == Person.Sex.MALE &&
                p.getAge() >= 16 &&
                p.getAge() <= 25;
    }
}

可以看出我们的条件入参由基本类型演变成了一个接口的实现类,下面我们用匿名类实现

4、查询16-25的男性

package crelle.test.java.util.function.lambdatutorials;

import crelle.test.java.other.Utils;
import crelle.test.java.other.beans.Person;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

/**
 * @author:crelle
 * @className:Approach1
 * @version:1.0.0
 * @date:2020/8/15
 * @description: Specify Search Criteria Code in an Anonymous Class
 **/
public class Approach4 {
    public static void main(String[] args) {

        printPersons(Utils.getPersonsLists(),new CheckPerson() {
                    public boolean test(Person p) {
                        return p.getGender() == Person.Sex.MALE &&
                                p.getAge() >= 16 &&
                                p.getAge() <= 25;
                    }
                }
        );
    }


    public static void printPersons(
            List<Person> roster, CheckPerson tester) {
        for (Person p : roster) {
            if (tester.test(p)) {
                p.printPerson();
            }
        }
    }
}

条件入参我们还可以做改变,我们替换匿名类用lambda表达式来实现

5、查询16-25的男性

package crelle.test.java.util.function.lambdatutorials;

import crelle.test.java.other.Utils;
import crelle.test.java.other.beans.Person;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

/**
 * @author:crelle
 * @className:Approach1
 * @version:1.0.0
 * @date:2020/8/15
 * @description: Specify Search Criteria Code with a Lambda Expression
 **/
public class Approach5 {
    public static void main(String[] args) {
        printPersons(Utils.getPersonsLists(),(Person p) -> p.getGender() == Person.Sex.MALE && p.getAge() >= 16 && p.getAge() <= 25);
    }

    public static void printPersons(
            List<Person> roster, CheckPerson tester) {
        for (Person p : roster) {
            if (tester.test(p)) {
                p.printPerson();
            }
        }
    }
}

我们仔细研究一下CheckPerson接口,返现只有一个抽象方法,输入为对象,输出为boolean类型,我们发现和下面的接口test方法很像:

 

 

 我替换CheckPerson来使用它

 

 

6、查询16-25的男性

package crelle.test.java.util.function.lambdatutorials;

import crelle.test.java.other.Utils;
import crelle.test.java.other.beans.Person;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

/**
 * @author:crelle
 * @className:Approach1
 * @version:1.0.0
 * @date:2020/8/15
 * @description: Use Standard Functional Interfaces with Lambda Expressions
 **/
public class Approach6 {
    public static void main(String[] args) {
        printPersonsWithPredicate(Utils.getPersonsLists(),(Person p) -> p.getGender() == Person.Sex.MALE && p.getAge() >= 16 && p.getAge() <= 25);
    }

    public static void printPersonsWithPredicate(
            List<Person> roster, Predicate<Person> tester) {
            for (Person p : roster) {
                if (tester.test(p)) {
                    p.printPerson();
                }
            }
    }
}

我们可以把打印人员明细单独抽取出来,作为一个入参

7、查询16-25的男性

package crelle.test.java.util.function.lambdatutorials;

import crelle.test.java.other.Utils;
import crelle.test.java.other.beans.Person;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;

/**
 * @author:crelle
 * @className:Approach1
 * @version:1.0.0
 * @date:2020/8/15
 * @description: Use Lambda Expressions Throughout Your Application
 **/
public class Approach7 {
    public static void main(String[] args) {
        processPersons(Utils.getPersonsLists(), p -> p.getGender() == Person.Sex.MALE && p.getAge() >= 16 && p.getAge() <= 25, p -> p.printPerson()
        );
    }

    public static void processPersons(
            List<Person> roster,
            Predicate<Person> tester,
            Consumer<Person> block) {
        for (Person p : roster) {
            if (tester.test(p)) {
                block.accept(p);
            }
        }
    }
}

8、查询16-25的男性,并且打印他们的电子邮箱

package crelle.test.java.util.function.lambdatutorials;

import crelle.test.java.other.Utils;
import crelle.test.java.other.beans.Person;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;

/**
 * @author:crelle
 * @className:Approach1
 * @version:1.0.0
 * @date:2020/8/15
 * @description: Specify Search Criteria Code with a Lambda Expression
 **/
public class Approach8 {
    public static void main(String[] args) {
        processPersonsWithFunction(
                Utils.getPersonsLists(),
                p -> p.getGender() == Person.Sex.MALE
                        && p.getAge() >= 16
                        && p.getAge() <= 25,
                p -> p.getEmailAddress(),
                email -> System.out.println(email)
        );
    }

    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);
            }
        }
    }
}

我们用到了下面的函数式接口

 

   T - the type of the input to the function  函数输入

 R - the type of the result of the function 函数输出

   我们使用强大的stream配合lambda来实现查询16-25的男性,并且打印他们的电子邮箱

9、查询16-25的男性,并且打印他们的电子邮箱

package crelle.test.java.util.function.lambdatutorials;

import crelle.test.java.other.Utils;
import crelle.test.java.other.beans.Person;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;

/**
 * @author:crelle
 * @className:Approach1
 * @version:1.0.0
 * @date:2020/8/15
 * @description: Use Aggregate Operations That Accept Lambda Expressions as Parameters
 **/
public class Approach9 {
    public static void main(String[] args) {
        Utils.getPersonsLists()
                .stream()
                .filter(
                        p -> p.getGender() == Person.Sex.MALE
                                && p.getAge() >= 12
                                && p.getAge() <= 25)
                .map(p -> p.getEmailAddress())
                .forEach(email -> System.out.println(email));
    }


}

实现同一个功能代码少了多少,自己体会。

完毕!

 

标签:初体验,java,lamdba,Person,crelle,test,import,public
来源: https://www.cnblogs.com/crelle/p/13517850.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有