stream流

stream流

Stream是Java 8 API添加的一个新的抽象,称为流Stream,以一种声明性方式处理数据集合(侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式)

Stream的继承体系
public interface Stream<T> extends BaseStream<T, Stream<T>> {...}
public interface BaseStream<T, S extends BaseStream<T, S>>
        extends AutoCloseable {...}

Stream流是从支持数据处理操作的源生成的元素序列,源可以是数组、文件、集合、函数。流不是集合元素,它不是数据结构并不保存数据,它的主要目的在于计算

Stream流是对集合(Collection)对象功能的增强,与Lambda表达式结合,可以提高编程效率、间接性和程序可读性。

特点

  1. 直接阅读代码的字面意思即可完美展示无关逻辑方式的语义
  2. Stream流把真正的函数式编程风格引入到Java中
  3. 代码简洁

流程

  1. 获取Stream流
    • 创建一条流水线,并把数据放到流水线上准备进行操作
  2. 中间方法
    • 流水线上的操作
    • 一次操作完毕之后,还可以继续进行其他操作
  3. 终结方法
    • 一个Stream流只能有一个终结方法
    • 是流水线上的最后一个操作

获取Stream流

  • Collection体系集合
default Stream<E> stream() {
        return StreamSupport.stream(spliterator(), false);
}

使用Collection中的默认方法stream获取stream流

  • Map体系集合

把Map转换为Set,间接地生成流

  • 数组
Arrays.stream()

通过Arrays中的静态方法stream生成流

  • 同种数据类型的多个数据
public static<T> Stream<T> of(T... values) {
        return Arrays.stream(values);
}

通过Stream接口的静态方法of(T… values)生成流

Stream流中间操作方法

  • 常见方法

    方法名说明
    Stream filter(Predicate predicate)用于对流中的数据进行过滤
    Stream limit(long maxSize)返回此流中的元素组成的流,截取前指定参数个数的数据
    Stream skip(long n)跳过指定参数个数的数据,返回由该流的剩余元素组成的流
    static Stream concat(Stream a, Stream b)合并a和b两个流为一个流
    Stream distinct()返回由该流的不同元素(根据Object.equals(Object) )组成的流
    Stream map(Function<? super T, ? extends R> mapper);映射数据类型

方法的返回值是经过操作的Stream,故可以进行链式编程

Stream流终结方法

  • 常见方法

    方法名说明
    void forEach(Consumer action)对此流的每个元素执行操作
    long count()返回此流中的元素数

Stream流的收集操作

  • 概念

    对数据使用Stream流的方式操作完毕后,可以把流中的数据收集到集合中

  • 常用方法

    方法名说明
    R collect(Collector collector)把结果收集到集合中
  • 工具类Collectors提供了具体的收集方式

    方法名说明
    public static Collector toList()把元素收集到List集合中
    public static Collector toSet()把元素收集到Set集合中
    public static Collector toMap(Function keyMapper,Function valueMapper)把元素收集到Map集合中

代码演示

Vertex类中有一个filed:String label
有一个getter方法getLabel

private final List<Vertex> vertices = new ArrayList<>();
public Set<String> vertices() {
        return vertices.stream().map(Vertex::getLabel).collect(Collectors.toSet());
}

vertices.stream() 生成Stream.map() 将流中的Vertex类型映射成String类型,就是Vertex里的label
参数应是一个函数式接口实现类对象,可以用lambda表达式或方法引用简化
.collect() 收集流,根据传入的参数返回特定类型的集合
Collectors.toSet() 作为collect的参数,告诉collect方法返回Set
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值