在java的stream.builder中使用lambda表达式,核心做法是将lambda作为参数传递给builder的`add()`方法,或者将lambda直接作为函数式接口(如`predicate`、`consumer`)传入后续的处理链中。具体而言,你可以先通过`stream.builder()`获取构建器实例,然后在循环或逻辑判断中调用`.add(lambdaexpression)`来累积元素,最后调用`.build()`生成不可变的stream对象。如果lambda用于过滤或转换,则应在构建完成后对生成的stream调用`.filter()`或`.map()`并传入对应的lambda。

如何构建包含Lambda结果的Stream
要构建一个包含特定计算结果的Stream,最直接的方式是在循环中利用Lambda表达式生成数据并添加到Builder中。例如,假设我们需要生成一组经过简单计算的整数,可以在循环体内定义一个Lambda来计算值,然后将其包装或直接添加。这里演示如何通过Builder收集由Lambda处理后的字符串列表,最终形成一个Stream供后续消费。

import java.util.stream.Stream;
import java.util.stream.Collectors;
import java.util.List;
public class LambdaBuilderDemo {
public static void main(String[] args) {
// 使用 Stream.builder() 创建构建器
Stream.Builder<String> builder = Stream.builder();
// 模拟一些输入数据
String[] inputs = {"hello", "world", "java"};
// 在循环中使用 Lambda 处理数据并添加到 Builder
for (String input : inputs) {
// 定义一个简单的 Lambda 表达式进行转换
java.util.function.Function<String, String> transform = s -> s.toUpperCase();
// 应用 Lambda 并将结果添加到 Builder
builder.add(transform.apply(input));
}
// 构建最终的 Stream
Stream<String> stream = builder.build();
// 收集结果以验证
List<String> result = stream.collect(Collectors.toList());
System.out.println(result); // 输出: [HELLO, WORLD, JAVA]
}
}上述代码展示了完整的流程:首先创建`Stream.Builder`,接着在迭代过程中定义并执行Lambda表达式,将处理后的元素逐个加入构建器。最后通过`build()`方法获得真正的Stream。这种方式适用于需要动态决定Stream内容且希望避免中间集合开销的场景。
立即学习“Java免费学习笔记(深入)”;
如何在已构建的Stream上应用Lambda进行过滤
当Stream已经通过Builder构建完成后,通常需要对其中包含的元素进行进一步的处理,比如过滤或映射。这时,Lambda表达式主要作为参数传递给Stream API中的高阶函数,如`filter`或`map`。这种用法与直接在Builder中添加不同,它作用于整个流的数据集,而不是单个元素的构建过程。

import java.util.stream.Stream;
import java.util.stream.Collectors;
import java.util.List;
public class FilterWithLambda {
public static void main(String[] args) {
// 预先构建一个包含数字的 Stream
Stream.Builder<Integer> builder = Stream.builder();
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (int num : numbers) {
builder.add(num);
}
Stream<Integer> numberStream = builder.build();
// 在已构建的 Stream 上使用 Lambda 进行过滤
// 过滤出偶数
List<Integer> evenNumbers = numberStream
.filter(n -> n % 2 == 0) // Lambda 作为 Predicate
.collect(Collectors.toList());
System.out.println(evenNumbers); // 输出: [2, 4, 6, 8, 10]
}
}在这个例子中,`Stream.builder`仅用于初始化数据源。关键的Lambda逻辑出现在`filter`方法中,它接收一个`Predicate
Builder在close后再次add会抛出什么异常
在使用`Stream.builder()`时,必须注意构建器的生命周期。一旦调用了`build()`方法,该Builder实例即被视为“关闭”状态。如果在`build()`之后继续尝试调用`add()`方法,程序将抛出`IllegalStateException`。这是因为Stream是不可变的,`build()`操作标志着构建过程的终结,任何后续的修改请求都是非法的。这一行为确保了生成的Stream在多线程环境下的安全性以及数据的一致性。


















