java8之Stream API(创建Stream)

你已经了解到了,通过Java8在Collection接口中新添加的stream方法,可以将任何集合转化为一个Stream。如果你面对的是一个数组,也可以用静态的Stream.of方法将它转化为一个Stream:

package java8test;

import java.util.stream.Stream;

public class T6 {
    public static void main(String[] args) {
        //使用Stream的静态方法of
        Stream<String> words = Stream.of("ab,cd,ef,gh".split(","));
        System.out.printf("num: %d", words.count());
    }
}

of方法接受可变长度的参数,因此你可以构造一个含有任意个参数的Stream:

package java8test;

import java.util.stream.Stream;

public class T6 {
    public static void main(String[] args) {
        //使用Stream的静态方法of,参数为任意数量的参数
        Stream<String> words = Stream.of("gently","down","the","stream");
        System.out.printf("num: %d", words.count());
    }
}

使用Arrays.stream(array,from,to)方法将数组的一部分转化为Stream。示例:

package java8test;

import java.util.Arrays;
import java.util.stream.Stream;

public class T6 {
    public static void main(String[] args) {
        String[] arr = {"11","22","33","44","55"};
        //注意这里
        Stream<String> words = Arrays.stream(arr,1,3);
        System.out.printf("first:%s", words.findFirst().get());
    }
}

要创建一个不含任何元素的Stream,可以使用静态的Stream.empty方法:

package java8test;

import java.util.stream.Stream;

public class T6 {
    public static void main(String[] args) {
        //示例
        //泛型<String>会被编译器推导出来,这同Stream.<String>empty()一样
        Stream<String> silence = Stream.empty();
        System.out.println(silence.count());
    }
}

Stream接口有两个用来创建无限Stream的静态方法。generate方法接受一个无参数的函数(或者,从技术上来说,是一个Supplier<T>接口的对象)。当你需要一个Stream值时,就可以调用该方法来产生一个值。你可以通过如下代码来创建一个含有常量值的Stream:

package java8test;

import java.util.stream.Stream;

public class T6 {
    public static void main(String[] args) {
        //示例,使用generate()方法产生一个值
        Stream<String> echos = Stream.generate(() -> "Echo");
        System.out.println(echos.findFirst().get());
    }
}

或者一个含有随机数字的Stream:

package java8test;

import java.util.stream.Stream;

public class T6 {
    public static void main(String[] args) {
        //示例,使用generate()方法产生一个随机数
        Stream<Double> echos = Stream.generate(Math::random);
        System.out.println(echos.findFirst().get());
    }
}

要创建一个形如0 1 2 3 4 ....的无限序列,你可以使用iterate方法。它接受一个“种子(seed)”值和一个函数(从技术上讲,是一个UnaryOperator<T>接口的对象)作为参数,并且会对之前的值重复应用该函数。例如:

//示例,使用iterator方法产生一个无限序列
Stream<BigInteger> integers = Stream.iterate(BigInteger.ZERO, n -> n.add(BigInteger.ONE));

序列中的第一个元素是种子BigInteger.ZERO;第二个值是f(seed),或者1;下一个元素是f(f(seed)),或者2,以此类推。

注意:在java8中,添加了许多能够产生Stream的方法。例如,Pattern类添加了一个splitAsStream的方法,能够按照正则表达式对CharSequence对象进行分隔。你可以使用如下代码对一个字符串按照单词进行分隔。

静态方法Files.lines会返回一个包含文件中所有行的Stream。Stream接口有一个父接口AutoCloseable。当在某个Stream上调用close方法时,底层的文件也会被关闭。为了确保关闭文件,最好使用java7中提供的try-with-resources语句,如下:

try(Stream<String> lines = Files.lines(path)){
    //对lines进行一些处理
}

这样,当正常退出try语句块或者抛出异常时,Stream与其关联的底层文件都将被关闭。

时间: 2024-10-21 10:11:04

java8之Stream API(创建Stream)的相关文章

7. Java8新特性_创建 Stream

一.了解Stream Java8中有两大最为重要的改变.第一个是Lambda表达式:另外一个则是Stream API Stream 是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作.使用Stream API 对集合数据进行操作,就类似于使用SQL执行的数据库查询.也可以使用Stream API来并行执行操作.简而言之,Stream API提供了一种高效且易于使用的处理数据的方式. 二.什么是Stream 流(Stream)到底是

java8(2)--- Stream API

1.简述 Java8中有两大最为重要的改变.第一个是 Lambda 表达式:另外一 个就是 Stream API. Stream 是处理集合的抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作.使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询,比如可以实现group by的分组操作.总之就是Stream API提供的高效简介的数据处理方式. 流(Stream)是什么?心脏的血液通过血管流变全身,在血管中的时候就可以看做流,

Java 8新特性:全新的Stream API

Java 8引入了全新的Stream API.这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同. Stream API引入的目的在于弥补Java函数式编程的缺陷.对于很多支持函数式编程的语言,map().reduce()基本上都内置到语言的标准库中了,不过,Java 8的Stream API总体来讲仍然是非常完善和强大,足以用很少的代码完成许多复杂的功能. 创建一个Stream有很多方法,最简单的方法是把一个Collection变成Stream.我们

Java8 Stream API

Stream是Java8中,操作集合的一个重要特性. 从iteration到Stream操作 当你操作一个集合的时候,你通常的做法是迭代每一个元素,然后处理你想要的事情.举个例子: String contents = new String(Files.readAllBytes( Paths.get("alice.txt")), StandardCharsets.UTF_8); // 读取文件到字符串中 List<String> words = Arrays.asList(c

JAVA8新特性之 Stream API

重要的 Stream API  : java.util.Stream.* Stream提供了一种高效且简易处理数据的方式 注意:1.Stream自己不会存储元素 2.对Stream进行操作不会改变数据源,相反,会产生一个执有结果的新Stream 3.Stream操作是延迟执行的.只有进行了终止操作才会产生结果 (并行流就是把内容分成多个数据块,并用不同的线程分别处理每个数据块.在Java8 后,Stream API可以声明性的通过parallel()与sequential()在并行流与串行流(顺

Java8新特性Stream API与Lambda表达式详解(1)

1 为什么需要Stream与Lambda表达式? 1.1  为什么需要Stream Stream作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念.它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream.Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作(aggr

java8新特性(Stream API)

Stream API的操作步骤: 1.创建Stream 2.中间操作 3.终止操作(终端操作) //1. 创建 Stream @Test public void test1(){ //1. Collection 提供了两个方法 stream() 与 parallelStream() List<String> list = new ArrayList<>(); Stream<String> stream = list.stream(); //获取一个顺序流 Stream&

使用Java8 Stream API对Map按键或值进行排序

一.什么是Java 8 Stream 使用Java 8 Streams,我们可以按键和按值对映射进行排序.下面是它的工作原理: 将Map或List等集合类对象转换为Stream对象 使用Streams的sorted()方法对其进行排序 最终将其返回为LinkedHashMap(可以保留排序顺序) sorted()方法以Comparator作为参数,从而可以按任何类型的值对Map进行排序.如果对Comparator不熟悉,可以看本号前几天的文章,有一篇文章专门介绍了使用Comparator对Lis

何用Java8 Stream API进行数据抽取与收集

上一篇中我们通过一个实例看到了Java8 Stream API 相较于传统的的Java 集合操作的简洁与优势,本篇我们依然借助于一个实际的例子来看看Java8 Stream API 如何抽取及收集数据. 备注:上一篇内容:如何用Java8 Stream API找到心仪的女朋友 ## 目标&背景 我们以"处理订单数据"为例,假设我们的应用是一个分布式应用,有"订单应用","物流应用","商品应用"等都是独立的服务.本次我