篇一中谈到了Lambda的基本语法,核心函数式接口以及方法引用的概念,现在让我们把关注点放到Stream Api上
一. Stream API
流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。集合关注的是数据,而流关注的是计算!
注意:
1. Stream不会自己存储元素。
2. Stream不会改变源对象。相反,他们会返回一个持有结果的新Stream。
3. Stream操作是延迟的。
Stream的操作大致分成以下三步:
1. 创建Stream
一个数据源(如:集合、数组), 获取一个流
/**
* 创建Stream
*/
@org.junit.Test
public void test1(){
//1. 通过Collection系列集合提供的stream()或parallelStream()将集合转换成集合流
List<String> list = new ArrayList<>();
Stream<String> stream1 = list.stream();
//2. 通过Arrays的静态方法stream()将数组转换成数组流
Employee[] employee = new Employee[10];
Stream<Employee> stream2 = Arrays.stream(employee);
//3. 通过Stream中的静态方法of()
Stream<String> stream3 = Stream.of("a", "b", "c");
//4. 创建无限流
//4.1 迭代
Stream<Integer> stream4 = Stream.iterate(0, x->x+2); //给出一个seed==0,根据一元表达式进行迭代产生无限流
//stream4.forEach(System.out::println);
//4.2 生成
Stream<Double> stream5 = Stream.generate(Math::random);
stream5.forEach(System.out::println);
}
2. 中间操作
中间操作链。多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则在执行中间操作时不会执行任何的处理。而在终止操作时一次性全部处理结果的做法被称为"惰性求值"。
筛选与切片:
1. filter(Predicate predicate)
接收Lambda,从流中排除某些元素。
2. distinct()
筛选,通过流所生成元素的hashCode()和equals()去除重复元素。
3. limit(long maxSize)
截断流,使其元素不超过给定的数量。
4. skip(long n)
跳过元素,返回一个扔掉了前n个元素的流。若流中的元素不足n个,则返回一个空流。与limit(long n)互补。
List<Employee> employees = Arrays.asList(
new Employee("Jack1", 18, 8888),
new Employee("Jack2", 20, 6666),
new Employee("Jack3", 19, 9999),
new Employee("Jack4", 25, 3333),
new Employee("Jack4", 25