java - java 10中的Lazy flatMap实现算法
问题描述
我知道 java 流,并尝试实现 map、filter、fold(以自定义函数作为参数)、严格和惰性评估方式。
但是我无法在 java 中实现 flatmap 的惰性实现。法线贴图、过滤器、折叠只是在主迭代器(如果它的列表)上运行的组合函数,如果传入值为空,则丢弃函数的应用。
但是 flatMap 输入函数会产生另一个需要展平的列表(流),
java 10 中的lazy flatMap 是如何实现的?有没有关于算法的文档?
谢谢。
解决方案
如果要实现lazy flatMap
,最重要的部分是提供正确的实现Iterator
。此实现可能如下所示:
final class FlatMappedIterator<A, B> implements Iterator<B> {
private final Iterator<A> iterator;
private final Function<A, Iterable<B>> f;
private Iterator<B> targetIterator; // Iterator after applying `f` to element of type A
FlatMappedIterator(Iterator<A> iterator, Function<A, Iterable<B>> f) {
this.iterator = iterator;
this.f = f;
}
@Override
public boolean hasNext() {
if (targetIterator != null && targetIterator.hasNext()) {
return true;
} else if (iterator.hasNext()) {
A next = iterator.next();
Iterable<B> targetIterable = f.apply(next);
targetIterator = targetIterable.iterator();
return targetIterator.hasNext();
} else {
return false;
}
}
@Override
public B next() {
if (hasNext()) {
return targetIterator.next();
} else {
throw new NoSuchElementException();
}
}
}
因此,下一个元素的检索被推迟到调用hasNext
or的那一刻。next
然后你需要实现flatMap
函数本身。但这很容易。我把它作为练习留给读者:)
推荐阅读
- python - 当我在函数/方法中有输入时,我该如何测试它?
- java - Pentaho 不能只用一个用户登录。所有其他用户工作正常
- ms-access - 如何使用具有多个值的一个参数进行查询?
- excel - 如何计算文本框值的总和并将其打印到单元格?
- linux - 无法连接到存储库 SVN
- javascript - 如何将导入的 Slack 数据定位到 Google 表格的特定单元格中?
- android - 错误:无法访问 zzbgl 错误不断重新出现
- c - malloc 覆盖按值传递的参数
- twilio - 当用户进行特定选择时,我如何(使用 Twilio Functions 示例关键字处理程序)向外部网站发送 POST 请求?
- bash - 如何在分隔符上拆分字符串并将常量值附加到所有元素