Stream概念
是数据的渠道,用于操作数据源(集合、数组等)所生成的元素序列,Stream有一个计算的过程
特点
Stream自己不会存储元素 Stream不会改变源对象,相反,他们会返回一个持有结果的新Stream Stream操作是延迟执行的,这意味着他们会等到需要结果的时候才执行
Stream的获取
Collection存在两种获取流的方式
获取顺序流
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream();
获取一个并行流
Stream<String> parallelStream = list.parallelStream();
数组存在一种获取流的方式
Integer[] nums = new Integer[10];
Stream<Integer> stream1 = Arrays.stream(nums);
Stream中的静态方法创建流
Stream<Integer> stream2 = Stream.of(1,2,3,4,5,6);
创建无限流
迭代:参数0是起始位置,第二个参数是迭代的,每次加2
Stream<Integer> stream3 = Stream.iterate(0, (x) -> x + 2).limit(10);
stream3.forEach(System.out::println);
生成:生成随机数
Stream<Double> stream4 = Stream.generate(Math::random).limit(2);
stream4.forEach(System.out::println);
中间操作
筛选
惰性求值
添加数据
List<Employee> emps = Arrays.asList(
new Employee(102, "李四", 59, 6666.66),
new Employee(101, "张三", 18, 9999.99),
new Employee(103, "王五", 28, 3333.33),
new Employee(104, "赵六", 8, 7777.77),
new Employee(104, "赵六", 8, 7777.77),
new Employee(104, "赵六", 8, 7777.77),
new Employee(105, "田七", 38, 5555.55)
);
过滤并输出过滤后的数据
public void test2(){
Stream<Employee> stream = emps.stream()
.filter((e) -> {
System.out.println("测试中间操作");
return e.getAge() <= 35;
});
stream.forEach(System.out::println);
}
只有当终止操作时(forEach),所有的中间操作会一次性的全部执行,称为“惰性求值” ,如果将打印语句去掉,中间操作是不会执行的
过滤后输出的结果是年龄小于等于35的员工的信息
截断流
@Test
public void test4(){
emps.stream()
.filter((e) -> {
return e.getSalary() >= 5000;
}).limit(3)
.forEach(System.out::println);
}
只要是找到了三个元素以后就不再进行迭代了,可以提高效率
跳过元素
@Test
public void test5(){
emps.parallelStream()
.filter((e) -> e.getSalary() >= 5000)
.skip(2)
.forEach(System.out::println);
}
返回一个去除掉前n个元素的流,若元素的个数不足n个,则返回一个空流。
筛选元素
@Test
public void test6(){
emps.stream()
.distinct()
.forEach(System.out::println);
}
去除重复元素,要保证实体类重写了equals和HashCode方法
映射
Map
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
@Test
public void test(){
List<String> list=Arrays.asList("as","zhai","hh","hub");
list.stream()
.map((str)->str.toUpperCase())
.forEach(System.out::println);
}
map—接收Lambda,将元素转换成其他形式或提取信息。接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
AS
ZHAI
HH
HUB
FlatMap