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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值