Java8新特性——Stream API

4、Stream API

4.1、Stream API定义

Stream API(流)是java8中处理集合的关键抽象概念,是一个数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。执行复杂的查找、过滤和映射数据等操作。使用Stream API对集合或数组数据进行操作,提供了一种高效且易于使用的处理数据的方式。

tips:

  • Stream不会对元素进行存储;

  • Stream不会改变数据源(源对象),执行相关操作后返回一个持有结果的新Stream流;

  • Stream操作是延迟执行,只有需要结果的时候才会执行。

4.2、Stream API 的使用

3步骤:

  • a、创建Stream流(利用数据源(数组、集合等)获取一个流)

  • b、中间操作

  • c、终止操作

4.2.1、创建Stream流

4种方式:

  1. 通过Collection中的Stream()和paralleStream()方法获取 集合流

  2. 通过Arrays中的stream()方法获取 数组流

  3. 通过stream中的of()方法获取流 可以接受同一类型的任意数量的参数

  4. 通过stream中的iterate()和generate()方法获取 无限流

代码示例:

package com.lt.StreamDemo;
​
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
​
import org.junit.Test;
​
public class TestStream {
    /**
     * 创建Stream流
     */
    @Test
    public void Test1() {
        //方式1:  通过Collection中的Stream()和paralleStream()方法获取  集合流
        List<String> list=new ArrayList<String>();
        Stream<String> stream1=list.stream();   //获取顺序流
        Stream<String> stream2=list.parallelStream();   //并行流
        
        //方式2:  通过Arrays中的stream()方法获取  数组流
        int[] int1=new int[16];
        IntStream stream3=Arrays.stream(int1);
        
        //方式3:  通过stream中的of()方法获取流  可以接受同一类型的任意数量的参数
        Stream<String> stream4=Stream.of("阿波罗","波赛东","盖亚");
        
        //方式4:  通过stream中的iterate()和generate()方法获取  无限流
        Stream.iterate(2, (x) -> x*(x+1)).limit(6).forEach(System.out::println);  //迭代
        Stream.generate(Math::random).limit(6).forEach(System.out::println);    //生成
        /**
         * 以下涉及到中间操作和终端操作,这里不做深究,后面笔记会进一步说明
         */
        List<Double> stream5=Stream.generate(Math::random).limit(8).collect(Collectors.toList());
        System.out.println(stream5);
    }
}

4.2.2、中间操作

1、中间操作符:

API方法作用
filter()接受Lambda表达式,从Stream流中排出某些元素
limit()截断Stream流,使其元素不超过给定数量
distinct()筛选,通过Stream流所产生元素的hashCode()和equals()去除重复的元素
skip(n)跳过元素,返回一个扔掉前n个元素的流
sorted()对数据进行排序
map()将Stream流映射成另外一种数据

2、代码示例:

package com.lt.StreamDemo;
​
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
​
import org.junit.Test;
​
import com.lt.entity.Student;
public class TestStream {
   /**
     *中间操作符示例
     */
    @Test
    public void Test2() {
        //filter()示例
        List<String> list=Arrays.asList("张飞","赵云","关羽","黄忠","马超","黄忠","张飞");
        list.stream().filter((x) -> x.contains("关羽")).forEach(System.out::println);
        System.out.println("=====================");
        
        //limit()示例1
        list.stream().distinct().forEach(System.out::println);
        System.out.println("=====================");
        //limit()示例2
        List<Student> list1=new ArrayList<Student>();
        list1.add(new Student("赵云",18));    
        list1.add(new Student("马超",19));
        list1.add(new Student("吕布",21));
        list1.add(new Student("关羽",19));
        list1.add(new Student("张飞",20));
        list1.add(new Student("貂蝉",17));
//      list1.stream().distinct().forEach(System.out::println);
        /**
         * 当使用distinct()方法时,所产生元素的hashCode()和equals()去除重复的元素
         */
        List<Student> stu=list1.stream().distinct().collect(Collectors.toList());
        System.out.println(stu);
        System.out.println("=====================");
        
        //limit()示例
        list.stream().limit(4).forEach(System.out::println);
        System.out.println("=====================");
        
        //skip()示例
        list.stream().skip(2).forEach(System.out::println);
        System.out.println("=====================");
        
        //sorted()示例
        list1.stream().sorted((x,y) -> Integer.compare(x.getAge(),y.getAge())).forEach(System.out::println);
        System.out.println("=====================");
        
        //map()示例
        list1.stream().map(Student::getAge).forEach(System.out::println);
        System.out.println("=====================");
        
    }
}

4.2.3、终止操作

1、终止操作符

API方法作用
forEach()遍历数据源(集合、数组等)中的元素
min()求数据源(集合、数组等)的元素中的最小值
max()求数据源(集合、数组等)的元素中的最大值
count()计算数据源(集合、数组等)的元素个数
reduce()规约 可以把所有数据相加
collect()收集并将数据整合成list集合 或者set集合

2、代码示例

package com.lt.StreamDemo;
​
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
​
import org.junit.Test;
​
import com.lt.entity.Student;
​
public class TestStream {
    /**
     * 终止操作符
     */
    @Test
    public void Test3() {
        
        //定义一个List集合存放多个实体对象
        List<Student> list=new ArrayList<Student>();
        list.add(new Student("法海",20));
        list.add(new Student("小青",19));
        list.add(new Student("白素贞",20));
        list.add(new Student("许仙",22));
        list.add(new Student("连翘",21));
        //forEach()示例
        list.stream().forEach(System.out::println);
        System.out.println("========================");
        
        //min()示例
        Optional<Student> min=list.stream().min((x,y) -> Integer.compare(x.getAge(), y.getAge()));
        System.out.println(min.get());
        System.out.println("========================");
        
        //max()示例
        Optional<Student> max=list.stream().max((x,y) -> Integer.compare(x.getAge(), y.getAge()));
        System.out.println(max.get());
        System.out.println("========================");
        
        //count()示例
        long l1=list.stream().count();
        System.out.println(l1);
        System.out.println("========================");
        
        //reduce()示例
        Optional<Integer> reduce=list.stream().map(Student::getAge).reduce((x,y) -> x+y);
        System.out.println(reduce);
        System.out.println("========================");
        
        //collect()示例
        List<String> list1=list.stream().map(Student::getName).collect(Collectors.toList());
        for (String str : list1) {
            System.out.println(str);
        }
    }
}
​
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值