java1.8特性-Lambda(一個簡單的場景的實現)

java1.8特性-Lambda

新建一個實體的例子

public class Person {

    String name;
    int age;
    String flag = "標記";


    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person() {

    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public String getFlag() {
        return flag;
    }

    public void setFlag(String flag) {
        this.flag = flag;
    }

}

場景:挑出大於18歲的成年人並標記一下

public class LambdaTest {

    Person p1 = new Person("lee", 12);
    Person p2 = new Person("wang", 19);
    Person p3 = new Person("zhao", 20);
    List<Person> persons = Arrays.asList(p1, p2, p3);
    List<Person> persons2 = new ArrayList<Person>();

           @Test
    public void getLambda() {

        for (Person person : persons
                ) {
            if (person.getAge() > 18) {
                person.setFlag("成年");
                persons2.add(person);

            }

        }
        System.out.println("========java基本的實現=======");
        for (int i = 0; i < persons2.size(); i++) {
            System.out.println(persons2.get(i).getName() + ":" + persons2.get(i).getAge()+ ":" + persons2.get(i).getFlag());
        }

        System.out.println("========Lambda功能的實現=======");
        List<Person> personList = persons.stream()
                .filter(p -> p.getAge() > 18)
                .map(p -> {
                    p.setFlag("成年");
                    return p;
                })
                .collect(Collectors.toList());
        personList.forEach(p->System.out.println(p.getName() + ":" + p.getAge()+ ":" + p.getFlag()));
    }
}

關於stream的常規用法:集合、數組的stream操作的三個步驟:1、創建一個流Stream 2、中間操作map、filter 3、終止操作collect、forEach

    //參考:http://www.importnew.com/19838.html  理論
    //     https://www.zhihu.com/question/20125256/answer/324121308  圖示的方式
    //https://blog.csdn.net/op134972/article/details/76408237?locationNum=1&fps=1 java8新特性 主要的5點
    //集合、數組的stream操作的三個步驟:1、創建一個流Stream 2、中間操作map、filter 3、終止操作 collect、forEach


    /**
     * map的使用,注意接收入參並返回
     * 對集合屬性的修改,這裏大於18歲的標記爲成年
     * 利用Collectors工具類的toList()收集操作的最後的接口
     */
    @Test
    public void mapTest() {
        persons2 = persons.stream()
            .map(p -> {
            p.setFlag("成年");
            return p;
        }).collect(Collectors.toList());
        persons2.forEach(p -> System.out.println(p.getName() + ":" + p.getAge() + ":" + p.getFlag()));
    }

    /**
     * filter 的使用
     * 對集合屬性的條件查詢,這裏大於18歲的標記爲成年
     */

    @Test
    public void filterTest() {
        persons2 = persons.stream().filter(p -> p.getAge() > 18).collect(Collectors.toList());
        persons2.forEach(p -> System.out.println(p.getName() + ":" + p.getAge()));

    }
Optional的用法:實際上是一個容器,它可以保存類型T的值,減少空指針的異常。
    @Test
    public void optionalTest() {

        Person person = null;

        Optional<Person> personOptional = Optional.ofNullable(person);
//        1、orElse如果創建的Optional中有值存在,則返回此值,否則返回一個默認值
//        System.out.println(Optional.ofNullable(person).map(Person::getAge).orElse(18));
//        2、orElseGet如果創建的Optional中有值存在,則返回此值,否則返回一個由Supplier接口生成的返回值
//        System.out.println(Optional.ofNullable(person).map(Person::getAge).orElseGet(()->{return 18;}));
//        System.out.println(personOptional.map(Person::getAge)
//                  .orElseGet(()->new Person("lee4",22).getAge()));
        person = personOptional
                .orElseGet(() -> new Person("lee4", 22));
        System.out.println(person);

        persons = null;
        Optional<List<Person>> personsOptional = Optional.ofNullable(persons);

        List<Person> personList = personsOptional.orElseGet(Collections::emptyList);
        System.out.println(personList);
    }
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章