Sream流方法引用

Posted m0_56426304

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

 

 

以上是关于Sream流方法引用的主要内容,如果未能解决你的问题,请参考以下文章

java缓冲字符字节输入输出流:java.io.BufferedReaderjava.io.BufferedWriterjava.io.BufferedInputStreamjava.io.(代码片段

java内存流:java.io.ByteArrayInputStreamjava.io.ByteArrayOutputStreamjava.io.CharArrayReaderjava.io(代码片段

无法对非静态方法 getAssets() 进行静态引用 - 无法在片段中播放音频

Java基础-Stream流方法引用篇

如何在 FragmentPagerAdapter 中添加片段标签以便稍后引用片段?

此应用小部件片段中所有意图 (PendingIntents) 的逻辑流