Sream流方法引用
Posted m0_56426304
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sream流方法引用相关的知识,希望对你有一定的参考价值。
目录
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
以上是关于Sream流方法引用的主要内容,如果未能解决你的问题,请参考以下文章
java缓冲字符字节输入输出流:java.io.BufferedReaderjava.io.BufferedWriterjava.io.BufferedInputStreamjava.io.(代码片段
java内存流:java.io.ByteArrayInputStreamjava.io.ByteArrayOutputStreamjava.io.CharArrayReaderjava.io(代码片段
无法对非静态方法 getAssets() 进行静态引用 - 无法在片段中播放音频