【发布时间】:2019-03-18 16:32:34
【问题描述】:
我正在尝试处理具有 2 层深度的嵌套列表的对象。例如我的对象可以分解成这样的:
TopLevel: [
MidLevel: [
LowLevel,
LowLevel,
.
.
],
MidLevel: [
LowLevel,
LowLevel,
.
.
]
.
.
]
基本上TopLevel 包含MidLevel 对象的列表,而每个对象又包含LowLevel 对象的列表。在处理结束时,我想为每个LowLevel 对象构建SomeObj。但是SomeObj 需要来自TopLevel、MidLevel 和LowLevel 的信息。
在过去的几个月里,我一直在尝试以更实用的风格编写代码,所以我的第一个想法是创建一个可以在对象的每个级别上构建的高阶函数。函数如下所示:
Function<MidLevel, Function<LowLevel, SomeObj>> buildObjects(TopLevel topLevel) {
return midLevel ->
lowLevel -> {
return buildSomeObj(topLevel, midLevel, lowLevel);
};
}
我打算以如下方式使用这个函数(假设我有提供列表流的实用函数):
Function<MidLevel, Function<LowLevel, SomeObj>> topBuilder = buildObjects(topLevel);
List<SomeObj> objs = topLevel.streamMid()
.map(topBuilder)
.streamLow()
.map(Function::apply)
.collect(/*collect to list*/);
但是,这显然不起作用,因为一旦我将 MidLevel 对象应用于 topBuilder 函数,我的流现在是函数流而不是 MidLevel 对象,因此我无法访问列表LowLevel 流中的对象不再存在。
是否有任何解决方案,或者当它不太适合它时,我是否正在尝试在功能上解决这个问题?有没有办法既应用该函数,又可以访问应用于该函数的原始对象?
【问题讨论】:
标签: java functional-programming java-stream