【发布时间】:2014-08-03 14:13:17
【问题描述】:
我正在尝试深入研究 Java 8 流,但时不时仍会卡住。我目前有一个问题,我知道它可以通过流来完成,但我似乎无法理解如何正确使用它们。
我有一个字符串 A 的列表,并尝试通过某个规则找到与 A 的另一个元素 b 匹配的 A 的所有元素 a,然后从中创建一个 Map<String, List<String>>,其中包含所有 a -> 所有匹配的 b。
详细说明:
- 对于 A 中的每个 a,使用谓词 P 与 A 中的每个 b 进行比较。
- 如果 P(a,b) 匹配,则从 a 和 b 生成一对 (x, y)。
- 将所有对按 x 分组并作为地图返回。
你能给我一个有效的 Java 8 流示例吗?
编辑:我将如何以不必要的昂贵方式做到这一点:
Pairs(x,y) = forEach(a,b in A)
where (a != b && P(a, b))
generatePairXY(a, b)
Map(x -> List(y)) = group(Pairs(x,y)) by x
这种方法的问题是我首先需要构建一个巨大的对列表,考虑到我的数百万字数据集,这可能会耗尽内存。
【问题讨论】:
-
您基本上是在创建等价组。您的方法将导致每个组的 N 倍重复,其中 N 是组大小。如果您可以改为定义一个判别器函数,它为每个组生成一个唯一值,那么您的算法的复杂性将大大降低。
-
我很想看看你的想法的工作代码示例。
-
定义了鉴别器函数,这将是一个简单的
collect(groupingBy(discriminatorFn))操作。当然,函数的定义取决于你。 -
我仍然难以理解所有这些高级流函数,这就是我问这个问题的原因。可悲的是,我的想法只是通过例子来工作。
标签: java mapreduce java-8 java-stream