终端操作以评估中间操作

Cla*_*iga 1 java java-8 java-stream

假设我有一个字符串列表,我想将这些字符串用作流利的构建器的输入。

List<String> scripts;

//initialize list

ScriptRunnerBuilder scriptRunnerBuilder = new ScriptRunnerBuilder();

BiFunction<String,ScriptRunnerBuilder,ScriptRunnerBuilder> addScript = 
(script,builder) -> builer.addScript(script);

scriptRunnerBuilder = scripts.stream.map(script -> 
addScript.apply(script,scriptRunnerBuilder)).......

scriptRunnerBuilder.build();
Run Code Online (Sandbox Code Playgroud)

我可以使用哪个终端操作,以便对列表中的所有元素调用addScript函数?

问题在于ScriptRunnerBuilder是不可变的,因此ScriptRunnerBuilder.addScript()返回新的ScriptRunnerBuilder对象,而不是修改现有对象-因此,我不能只是一个foreach。

我的意图是携带addScript()调用的结果,并将其用作流中下一个元素的输入

Ber*_*eri 5

以最简单的方式,这应该:

// create your builder
ScriptRunnerBuilder builder = new ScriptRunnerBuilder();

// add all scripts
scripts.forEach(script-> builder.addScript(script))

build results
scriptRunnerBuilder.build();
Run Code Online (Sandbox Code Playgroud)

由于构建器将聚合所有数据,并且您已在forEach lambda外部创建了数据,因此可以直接访问它。这将导致更少的代码和相同的结果。

或如@Holger建议的那样:

scripts.forEach(builder::addScript);
Run Code Online (Sandbox Code Playgroud)

  • 甚至`scripts.forEach(builder :: addScript);` (3认同)