我正在努力理解一些Java 8 Stream功能。我对FP有一定的了解,因为30年前写过一些Lisp,但我认为我可能在尝试做一些这个新设施并不真正针对的事情。无论如何,如果问题很愚蠢,我很乐意学习我的错误。
我将提供一个具体的问题,虽然实际上我正在尝试解决一个通用的概念。
假设我想从流中的每第三个元素获取一个流。在常规FP中,我会(大约)创建一个递归函数,通过将列表的第一个元素与删除两个元素后剩余列表的(调用自身)连接来操作。足够容易。但是要在流中执行此操作,我觉得我想要以下两种工具之一:
1)一种操作可以从流中提取多个项目进行处理(然后我只需获取三个,使用第一个,然后丢弃其余部分)
2)一种制作以项和流为参数并创建流的供应商的方法。然后感觉我可以从第一个项目和缩短的流中创建下游流,尽管对我来说仍不清楚这是否会执行必要的递归魔法以实际工作。
开始编辑
所以,有一些有趣和有用的反馈;谢谢大家。特别是,评论帮助我更好地澄清了我的头脑正在尝试解决的问题。
首先,可以 - 至少在概念上 - 知道/需要知道序列中的顺序不应阻止人们允许完全可并行化的操作。我想到了一个例子,那就是图形人员倾向于执行的卷积操作。想象一下模糊图像。每个像素都是通过与其附近的像素相关来修改的,但是这些像素只是被读取,而不是自己进行修改。
据我了解(当然非常不稳定!),流机制是VM管理的并行世界的主要入口点,而迭代器仍然是它们一直以来的样子(是吗?不是吗?)如果正确的话,那么使用迭代器来解决我正在徘徊的问题领域似乎并不好。
因此,至少目前,创建一个分块分离器的建议似乎是最有前途的,但是支持该示例的代码似乎很费力!我认为我宁愿使用ForkJoin机制,尽管现在它已经“老套”了:)
无论如何,仍然对任何人提供的更多见解感兴趣。
结束编辑
有什么想法吗?我是否试图使用这些流来执行它们不打算执行的操作,还是我错过了一些明显的东西?
祝好, 托比。
我将提供一个具体的问题,虽然实际上我正在尝试解决一个通用的概念。
假设我想从流中的每第三个元素获取一个流。在常规FP中,我会(大约)创建一个递归函数,通过将列表的第一个元素与删除两个元素后剩余列表的(调用自身)连接来操作。足够容易。但是要在流中执行此操作,我觉得我想要以下两种工具之一:
1)一种操作可以从流中提取多个项目进行处理(然后我只需获取三个,使用第一个,然后丢弃其余部分)
2)一种制作以项和流为参数并创建流的供应商的方法。然后感觉我可以从第一个项目和缩短的流中创建下游流,尽管对我来说仍不清楚这是否会执行必要的递归魔法以实际工作。
开始编辑
所以,有一些有趣和有用的反馈;谢谢大家。特别是,评论帮助我更好地澄清了我的头脑正在尝试解决的问题。
首先,可以 - 至少在概念上 - 知道/需要知道序列中的顺序不应阻止人们允许完全可并行化的操作。我想到了一个例子,那就是图形人员倾向于执行的卷积操作。想象一下模糊图像。每个像素都是通过与其附近的像素相关来修改的,但是这些像素只是被读取,而不是自己进行修改。
据我了解(当然非常不稳定!),流机制是VM管理的并行世界的主要入口点,而迭代器仍然是它们一直以来的样子(是吗?不是吗?)如果正确的话,那么使用迭代器来解决我正在徘徊的问题领域似乎并不好。
因此,至少目前,创建一个分块分离器的建议似乎是最有前途的,但是支持该示例的代码似乎很费力!我认为我宁愿使用ForkJoin机制,尽管现在它已经“老套”了:)
无论如何,仍然对任何人提供的更多见解感兴趣。
结束编辑
有什么想法吗?我是否试图使用这些流来执行它们不打算执行的操作,还是我错过了一些明显的东西?
祝好, 托比。