gpt4 book ai didi

design-patterns - 如何在 Scala 中编写聚合模式?

转载 作者:行者123 更新时间:2023-12-04 07:11:43 28 4
gpt4 key购买 nike

假设我有 Iterator[A] ( 大小是无限的 )我想得到 Iterator[B]从中聚合了类型 A 的一些后续值。

例子:
我有字符串列表:

Iterator(
"START",
"DATA1",
"DATA2",
"DATA3",
"START",
"DATA1",
"DATA2",
//.. 10^10 more records
)

我想将字符串从 START 加入到 NEXT START 除外。 IE。写解析器。
Iterator(
"START DATA1 DATA2 DATA3",
"START DATA1 DATA2",
//.. 10^10 / 5 more records
)

我知道如何强制执行此操作,但我想使用 Scala 高阶函数来完成它。有任何想法吗?

PS EIP聚合 http://camel.apache.org/aggregator2.html .

最佳答案

如果你想要一个功能性的解决方案,你应该使用流而不是迭代器(流是不可变的)。这是一种可能的方法:

def aggregate(strs: Stream[String] ) = { 
aggregateRec( strs )
}

def aggregateRec( strs: Stream[String] ): Stream[String] = {
val tail = strs.drop(1)
if( tail.nonEmpty ) {
val (str, rest ) = accumulate( tail )
Stream.cons( str, aggregateRec( rest ) )
}
else Stream.empty
}

def accumulate( strs: Stream[String] ): (String, Stream[String]) = {
val first = "START " + strs.takeWhile( _ != "START").mkString(" ")
val rest = strs.dropWhile( _ != "START" )
( first, rest )
}

它按预期工作:
val strs = Stream( "START", "1", "2", "3", "START", "A", "B" )
val strs2 = aggregate( strs )
strs2 foreach println

关于design-patterns - 如何在 Scala 中编写聚合模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7392876/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com