1.filter(),函数中间需要一个断言,过滤出我们想要的信息

2.map(),将一个流映射成想要的一个流,这个流的操作可以帮助我们返回。

3.sorted()操作

4.peek()操作

5.注意已经执行完终止操作的流不能接着执行其他操作

package com.ydlclass.feature;

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

import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.IntBinaryOperator;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

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 filterTest(){
        //中间操作可以进行多次,复杂的操作,并且返回值依旧是一个stream,不修改原数据,也不会存储,如果需要存储则需要使用归集操作
        //
        Stream<Person> manofSalary = personList.stream().
                filter(person -> person.getSalary() > 3000).
                filter(person -> person.getSex().equals("男"));
        //中间操作的返回值是一个Stream,参数需要一个predicate对象
        manofSalary.forEach(System.out::println);

        //归集操作,这样写会产生异常,原因在于上面的stream已经结束了流,会抛出异常流已经被终止了
        //List<Person> collect = manofSalary.collect(Collectors.toList());
    }

    @Test
    //中间操作之映射,map
    public void mapTest(){
        //原本式员工的信息,现在只想保留工资的内容这就是中间操作
        List<Integer> collect = personList.stream().map(person -> person.getSalary())
                .collect(Collectors.toList());
        System.out.println(collect);

        //将每个员工的薪资张10000元
        personList.stream().map(person -> {
            person.setSalary(person.getSalary() + 10000);
            return person;
        }).forEach(System.out::println);
    }

    @Test
    public void sortTest(){
        //员工薪资从高到底排序
        Stream<Person> sorted = personList.stream().sorted(new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o2.getSalary() - o1.getSalary();
            }
        });

        //上面的内容转化更加优雅的写法
        //Stream<Person> sorted1 = personList.stream().sorted(Comparator.comparingInt(Person::getSalary));

        //Stream<Person> sorted1 = personList.stream().sorted((p1, p2) -> p2.getSalary() - p1.getSalary());
        //sorted1.forEach(System.out::println);
        sorted.forEach(System.out::println);
    }

    @Test
    //Stream由于在中间操作时不存储数据,所以不好做调试,使用peek可以帮助调试,如果直接调试那么会直接进入forEach方法中
    //peek的作用1:在中间输出一些关键信息帮助我们调试,作用2给每个员工加100
    public void peekTest(){
        personList.stream().filter(person -> person.getSalary() >= 8000).map(person -> {
            person.setSalary(person.getSalary());
            return person;
        }).peek(System.out::println).collect(Collectors.toList()).forEach(System.out::println);

        System.out.println("______________________");

        personList.stream().peek(person -> person.setSalary(person.getSalary() + 10000)).forEach(System.out::println);
    }


}