正在加载...

Java 中的 Streams

用 stream() 从列表开启管道,保留或变换元素,最后打印。在 Pipe.java 中保留 public 类 Pipe,导入 java.util.ArrayList,存入 "oak" 与 "pine",并调用 names.stream().filter(n -> n.startsWith("o")).forEach(n -> System.out.println(n));。用 javac Pipe.java 编译,运行 java Pipe。屏幕应显示 oak。第二个演示用 map,屏幕显示 OAK,再 PINE。把可选 Records 留给下一页。本课是 stream 管道,不是列表上 plain forEach,也不是 Generics 的 get(0) 演示。

过滤:保留一个词

打开 Pipe.java。保留 public 类名 Pipe。若遗留的纯 Cue lambda 演示、遗留 Bin Generics 打印、遗留 Program Arguments Flag 运行、遗留 Box Scanner 提示盖住 streams 故事,请删除。程序不应等待输入,也不应要求启动词。
在顶部添加 import:
import java.util.ArrayList;
在 Pipe.main 内建一个含两个词的泛型列表,再开启 stream,保留以 o 开头的词:
ArrayList<String> names = new ArrayList<>();
names.add("oak");
names.add("pine");
names.stream().filter(n -> n.startsWith("o")).forEach(n -> System.out.println(n));
stream() 打开管道。filter 保留 lambda 返回 true 的元素。forEach 打印每个保留元素。"oak" 以 o 开头。"pine" 不是。屏幕显示 oak。

Pipe stream filter prints oak

java
import java.util.ArrayList;

public class Pipe {
    public static void main(String[] args) {
        ArrayList<String> names = new ArrayList<>();
        names.add("oak");
        names.add("pine");
        names.stream().filter(n -> n.startsWith("o")).forEach(n -> System.out.println(n));
    }
}

在存放 Pipe.java 的文件夹运行 javac Pipe.java。花括号与分号正确时,javac 自己不输出一行。再运行 java Pipe — 不是 java Pipe.java。保持一个 public 类,使名称与 Pipe 一致。
走一遍运行。Java 从 Pipe.main 开始。列表有 "oak" 与 "pine"。stream() 开始。filter 保留 "oak"。forEach 打印 oak。不会打印两个词。不会只调用没有 stream() 的 names.forEach。不会读 args[0]。
看着屏幕念初学者规则:stream() 打开管;filter 选择;forEach 以打印副作用结束。本页不要发明 Records 演示。Records 等下一可选课。不要在本教学形态里去掉 stream() 却指望 filter 直接挂在列表上。
若遗留 Cue forEach 文件仍让你看到 oak 再 pine,改练 Pipe 并保留 filter 步骤。若 javac 拒绝 stream,确认列表类型是 ArrayList 且调用是 names.stream()。

映射:每个词变大写

保留同一 public 类 Pipe。把管道改成变换每个词,而不是过滤:
names.stream().map(n -> n.toUpperCase()).forEach(n -> System.out.println(n));
列表里仍保留 "oak" 与 "pine"。再次 javac Pipe.java 编译并 java Pipe 运行。屏幕显示 OAK,再 PINE。map 为每个元素返回新值。forEach 按顺序打印这些值。

Pipe stream map prints OAK then PINE

java
import java.util.ArrayList;

public class Pipe {
    public static void main(String[] args) {
        ArrayList<String> names = new ArrayList<>();
        names.add("oak");
        names.add("pine");
        names.stream().map(n -> n.toUpperCase()).forEach(n -> System.out.println(n));
    }
}

走一遍运行。第一个映射值是 OAK。第二个是 PINE。两个演示当作两种教学形态。先证明 filter 只留一个词。再证明 map 改变每个词。两种形态共享 import、泛型列表、stream() 与终端 forEach。
若以后自己实验里串联 filter 与 map,顺序重要。本页每个演示只留一个中间步骤,屏幕才好读。

管道习惯

练习时按顺序保留步骤。

📊 Pipe 的 stream 习惯

步骤 调用 初学者检查
开始 names.stream() 从列表打开管道
保留部分 filter(n -> ...) lambda 返回 true 才保留
逐个改变 map(n -> ...) lambda 返回新值
结束打印 forEach(n -> System.out.println(n)) 打印的终端步骤
跳过 stream() 此形态列表没有 filter 在 filter 或 map 前放 stream()

Streams 不是只要 Lambda,也不是 Records

Lambda 课教列表上直接 forEach。Streams 先把 stream() 放上,才能在最终 forEach 前 filter 或 map。Records 会在后面可选页介绍紧凑数据类型。今天不要把这三种职责混在一个初学者文件里。
filter 留下的 oak 仍是沿管道流动的列表元素。不是 Flag 的 args[0]。遗留 Cue 文件若无 filter 就打印每个元素,当作历史;保留 Pipe 的 stream().filter 行。
没有 stream(),本页的 filter 与 map 调用就不是教学形态。没有终端 forEach,管道不打印。练每个演示时把管道两端一起守住。Records 语法留到那堂课,即便你在可选路径别处瞥过紧凑类型标题。

Records 前的文件夹检查

成功编译后列出文件夹。应同时看到 Pipe.java 与 Pipe.class。编辑源码、保存、运行 javac Pipe.java,再 java Pipe。若切到 map 后跳过编译,陈旧 .class 可能仍显示旧 filter 屏幕。
若 javac 抱怨重复 public 类,只留 Pipe 为 public。若 filter 演示屏幕同时显示 oak 与 pine,可能缺 startsWith("o") 检查 — 恢复 filter lambda。若无输出,确认 add 在 stream() 之前执行。
不要把 Cue 的仅列表 forEach 贴来替换本页整条管道。不要把 Bin 的 get(0) 贴进 Pipe。可选 streams 作业是 stream 加一个中间步骤再加 forEach。

可选 Records 之前

你可以保留 public 类 Pipe、import ArrayList、添加 "oak" 与 "pine"、调用 names.stream().filter(n -> n.startsWith("o")).forEach(...) 看到 oak,再调用 names.stream().map(n -> n.toUpperCase()).forEach(...) 看到 OAK 再 PINE。用 javac Pipe.java 编译并 java Pipe 运行。表格分开开始、filter、map 与结束。下一可选页是 Records。
为清晰的 streams 一对保留 Pipe 演示。练管道时把 Cue lambda 文件留在本页外。练管道时把 Bin Generics 文件留在本页外。Records 工作留到那堂课。这些习惯是继续可选路径前的检查点。filter 屏幕显示 oak 或 map 屏幕显示 OAK 再 PINE 时,Streams 完成了本课任务,若继续可选路径你就准备好 Records。
最后再过一遍文件夹:一个 public Pipe、import 在、泛型 ArrayList<String>、filter 或 map 前有 stream()、终端 forEach、不等 Scanner、不需启动词。在你保持打开的演示上再运行一次 javac Pipe.java 与 java Pipe。若屏幕仍显示 oak 或 OAK 再 PINE,Streams 形态稳固,课程可进入下一页可选 Records。每次阅读保留一条清晰管道习惯,让每遍都教同一张图。

🧠 测试您的知识

准备开始

测试您的知识

通过这个互动测验挑战自己,看看你对这个主题的理解程度如何

❓
5
问题
🎯
70%
及格要求
♾️
∞
时间
🔄
∞
尝试次数

📝 说明

  • 仔细阅读每个问题
  • 为每个问题选择最佳答案
  • 您可以随时重新参加测验
  • 您的进度将显示在顶部