1.终止操作有多种: forEach,findFirst,findAny,allMatch,anyMatch

forEach()这个函数需要一个消费者,返回值是一个Optional对象

findFirst()、findAny()需要一个消费者返回值是一个Optional对象

allMatch(),anyMatch()需要一个断言,返回值是一个boolean对象

2.常规使用

package com.ydlclass.feature;

import org.junit.Before;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.function.Predicate;

public class LambdaTest {
    List<Person> personList = new ArrayList<>();
    List<Integer> simpleList = Arrays.asList(15,22,9,11,33,52,14);
    @Before
    public void initData(){
        personList.add(new Person("张三",3000,23,"男","太原"));
        personList.add(new Person("李四",7000,34,"男","西安"));
        personList.add(new Person("王五",5200,22,"女","西安"));
        personList.add(new Person("小黑",1500,33,"女","上海"));
        personList.add(new Person("狗子",8000,44,"女","北京"));
        personList.add(new Person("铁蛋",6200,36,"女","南京"));
    }
    @Test
    public void foreachTest(){
        personList.stream().forEach((s) -> System.out.println(s));//forEach需要一个消费者,这个消费者可以使用函数式编程
        System.out.println("--------");
        personList.stream().forEach(System.out::println);
    }

    @Test
    public void findTest(){
        Optional<Person> first = personList.stream().findFirst();//拿到第一个元素,返回值是一个Optinal
        first.ifPresent(System.out::println);//函数式编程,这个函数比如可以在一些排序之后获取第一个元素;此时由于中间操作为未使用

        Optional<Person> any = personList.stream().findAny();
        any.ifPresent(System.out::println);//找到一个就返回,在单线程和findFirst()相似,多线程下不同;


        System.out.println("下面是多线程结果:");
        //多线程版本
        Optional<Person> first1 = personList.parallelStream().findFirst();
        first1.ifPresent(System.out::println);

        Optional<Person> any1 = personList.parallelStream().findAny();
        any1.ifPresent(System.out::println);


        /***
         * 此测试函数的输出结果
         *
         *
         * Person{name='张三', salary=3000, age=23, sex='男', area='太原'}
         * Person{name='张三', salary=3000, age=23, sex='男', area='太原'}
         * 下面是多线程结果:
         * Person{name='小黑', salary=1500, age=33, sex='女', area='上海'}
         * Person{name='张三', salary=3000, age=23, sex='男', area='太原'}
         */
    }

    @Test
    public void matchTest(){
        //判断所有人的工资都大于300

        //匿名内部类实现
        //boolean b = personList.stream().allMatch(new Predicate<Person>() {
        //    @Override
        //    public boolean test(Person person) {
        //        return person.getSalary() > 3000;
        //    }
        //});
        //System.out.println(b);


        System.out.println(personList.stream().allMatch((p) -> p.getSalary() > 3000));

        //判断任意一个人大于8000
        boolean b1 = personList.stream().anyMatch((person -> person.getSalary() >= 8000));
        System.out.println(b1);
    }

}