Sream流、方法引用

目录

 

Stream流

方法引用


Stream流

Stream(流)是一个来自数据源的元素队列
元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算
数据源 流的来源。 可以是集合,数组 等
和以前的Collection操作不同, Stream操作还有两个基础的特征:
Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluentstyle)。 这样做可以对操作进行优化, 比延迟执行(laziness)和短路( short-circuiting)
内部迭代: 以前对集合遍历都是通过Iterator或者增强for的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式,可以直接调用遍历方法

Steam流的特点

属于管道流,只能使用一次

第一个Stream流调用完毕方法,数据就会流转到下一个Stream上

而这时第一个Stream流已经使用完毕,就会关闭了

所以第一个Stream流就不能再调用方法了

Stream流中的常用方法_map

如果需要将流中的元素映射到另一个流中,可以使用map方法

<R> Sream<R> map(Function<? super T, ? extends R> mapper);

该接口需要一个Function函数式接口参数,可以将当前流中的T类型数据转换为另一种R类型的流

Function中的抽象方法

   R apply(T t);

代码:

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
public class Demo05GetStream {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        // ...
        Stream<String> keyStream = map.keySet().stream();
        Stream<String> valueStream = map.values().stream();
        Stream<Map.Entry<String, String>> entryStream = map.entrySet().stream();
    }
}

Stream流中的常用方法_count

用于统计Sream流中元素的个数

long count( );

count方法是一个中介方法,返回值是一个long类型的整数

所以不能再继续调用Stream流中的其他方法了

Stream流中的常用方法_limit

用于截取李忠的元素

limit 方法可以对流进行截取,只取用前n个。方法签名:  Stream<T> limit(long maxSize);

     参数是一个long类型,如果集合当前长度大于参数刚进行截取,否则不进行操作

limit方法是一个延迟方法,只是对流中的元素进行截取,返回的是一个新的流。所以可以继续调用Stream流中的其他方法

Stream流中的常用方法_skip

如果希望跳过前几个元素,可以使用 skip 方法获取一个截取之后的新流:  Stream<T> skip(long n);

如果流的当前长度大于n,则跳过前n个,否则会得到一个长度为0的空流

Stream流中的常用方法_concat

如果有两个流,希望合并成为一个流,那么可以使用 Stream 接口的静态方法 concat

static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)

方法引用

方法引用符

双冒号 :: 为引用运算符,而它所在的表达式被称为方法引用。如果Lambda要表达的函数方案已经存在于某个方法的实现中,那么则可以通过双冒号来引用该方法作为Lambda的替代者

通过对象名引用成员方法

使用前提:对象名是已经存在的,成员方法也是已经存在的

就可以使用对象来引用成员方法

通过类名引用静态成员方法

使用前提:类已经存在,静态成员方法也已经存在,就可以通过类名直接引用静态成员方法

Lambda表达式: n -> Math.abs(n)
方法引用: Math::abs

通过super引用父类的成员方法

Lambda表达式: () -> super.sayHello()
方法引用: super::sayHello

通过this引用本类的成员方法

Lambda表达式: () -> this.buyHouse()
方法引用: this::buyHouse

类的构造器(构造方法)引用

由于构造器的名称与类名完全一样,并不固定。所以构造器引用使用 类名称::new 的格式表示

Lambda表达式: name -> new Person(name)
方法引用: Person::new

代码:

public class Demo10ConstructorRef {
    public static void printName(String name, PersonBuilder builder) {
       System.out.println(builder.buildPerson(name).getName());  
    }
    public static void main(String[] args) {
       printName("赵丽颖", Person::new);  
    }
}

数组的构造器引用

Lambda表达式: length -> new int[length]
方法引用: int[]::new

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值