Java8 教程

Java8 Stream 定义

Java Stream API 提供了一种处理对象集合的函数式方法。Java 8 中添加了 Java Stream API 以及其他一些函数式编程功能。

Java Stream API 与 Java IO 中的 Java InputStream 和 Java OutputStream 无关。InputStream 和 OutputStream 与字节流有关。Java Stream API 用于处理对象流,而不是字节流。

流定义

Java Stream 是一种能够对其元素进行内部迭代的组件,这意味着它可以自行迭代其元素。相比之下,当您使用 Java 集合的迭代功能(例如 Java Iterator 或与 Java Iterable 一起使用的 Java for-each 循环)时,您必须自己实现元素的迭代。

示例:迭代一个 List,将 List 中的每个元素转换为大写字符。

package com.hxstrive.jdk8.stream_api;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 流定义
 * @author hxstrive.com
 */
public class StreamDemo6 {

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("one");
        list.add("two");
        list.add("three");

        // 传统迭代
        for(String str : list) {
            System.out.println("common: " + str.toUpperCase());
        }

        // 流迭代
        list.stream().peek(e -> {
            System.out.println("stream: " + e.toLowerCase());
        }).collect(Collectors.toList());
    }
    // 输出结果:
    //common: ONE
    //common: TWO
    //common: THREE
    //stream: one
    //stream: two
    //stream: three
}

流处理

您可以为流附加监听器。当流在内部迭代元素时,这些监听器会被调用。流中的每个元素都会被调用一次监听器。这样,每个监听器都能处理流中的每个元素。这就是所谓的流处理。

流的监听器形成一个链。链中的第一个监听器可以处理流中的元素,然后返回一个新元素供链中的下一个监听器处理。监听器可以返回相同的元素,也可以返回新的元素,这取决于该监听器(处理器)的目的是什么。

示例:使用流的方式处理列表,为列表的每个元素添加多个 map 监听器,如下:

package com.hxstrive.jdk8.stream_api;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 流定义
 * @author hxstrive.com
 */
public class StreamDemo7 {

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("one");
        list.add("two");
        list.add("three");

        // 定义多个监听器
        List<String> newList = list.stream().map(e -> {
            // 第一个监听器,获取第一个字符
            return "char[0]=" + e.charAt(0);
        }).map(e -> {
            // 第二个监听器,e为第一个监听器的返回结果
            return "(" + e;
        }).map(e -> {
            // 第三个监听器,e为第二个监听器的返回结果
            return e + ")";
        }).collect(Collectors.toList());

        for(String item : newList) {
            System.out.println(item);
        }
    }
    // 输出结果:
    //(char[0]=o)
    //(char[0]=t)
    //(char[0]=t)
}

我们可以通过下面图来增加理解,如下图:

image.png

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号