Java8新特性:Stream 筛选与切片


package entity;

public class Employee {
    private String name;
    private int age;
    private double money;

	getset tostring.....
  
}
package com;

import entity.Employee;

import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.function.*;
import java.util.stream.Stream;

public class Main {


    static List employees = Arrays.asList(
            new Employee("aa", 18, 99999.99),
            new Employee("bb", 22, 222222.22),
            new Employee("cc", 33, 23123.9),
            new Employee("dd", 11, 139.99),
            new Employee("ee", 23, 929.99),
            new Employee("ff", 68, 1000.00)
    );


    public static void main(String[] args) {
        Stream stream = employees.stream();
        //可以看到这里面filter方法要传一个断言型接口。
        Stream employeeStream = stream.filter((e) -> e.getAge() > 30);
//        employeeStream.forEach((x)-> System.out.println(x));
        employeeStream.forEach(System.out::println);
    }
}

forEach方法里面要传一个消费型接口

filter方法要传一个断言型接口。

但是如果只有中间操作,没有后面的forEach终止操作:

 public static void main(String[] args) {
        Stream stream = employees.stream();
        //可以看到这里面filter方法要传一个断言型接口。
        Stream employeeStream = stream.filter((e) ->
                {
                    System.out.println("这是中间操作");
                    return e.getAge() > 30;
                }

        );

//        employeeStream.forEach((x)-> System.out.println(x));
//        employeeStream.forEach(System.out::println);
    }

可以看到,中间操作的代码没有执行。

如果再加上终止操作后:

 可以看到,终止操作有了才做中间操作。

惰性求值, 或者叫做延迟加载。

===================================

  可以看到,当满足了limit之后,就不在向后面继续迭代了,这可以作为一个小的优化点。