[{"data":1,"prerenderedAt":5869},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fbuilding\u002Fkstream-ktable":314,"\u002Fdocs\u002Fbuilding\u002Fkstream-ktable-surround":5864},[4,38,86,149,176,219,257,273],{"title":5,"path":6,"stem":7,"children":8,"icon":37},"Getting Started","\u002Fdocs\u002Fgetting-started","1.docs\u002F1.getting-started\u002F1.index",[9,12,17,22,27,32],{"title":10,"path":6,"stem":7,"icon":11},"Getting started","i-lucide-flag",{"title":13,"path":14,"stem":15,"icon":16},"Modules overview","\u002Fdocs\u002Fgetting-started\u002Fmodules-overview","1.docs\u002F1.getting-started\u002F2.modules-overview","i-lucide-boxes",{"title":18,"path":19,"stem":20,"icon":21},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","1.docs\u002F1.getting-started\u002F3.installation","i-lucide-download",{"title":23,"path":24,"stem":25,"icon":26},"License configuration","\u002Fdocs\u002Fgetting-started\u002Flicense-configuration","1.docs\u002F1.getting-started\u002F4.license-configuration","i-lucide-key-round",{"title":28,"path":29,"stem":30,"icon":31},"Your first app","\u002Fdocs\u002Fgetting-started\u002Ffirst-app","1.docs\u002F1.getting-started\u002F5.first-app","i-lucide-square-play",{"title":33,"path":34,"stem":35,"icon":36},"Project setup","\u002Fdocs\u002Fgetting-started\u002Fproject-setup","1.docs\u002F1.getting-started\u002F6.project-setup","i-lucide-package",false,{"title":39,"path":40,"stem":41,"children":42,"icon":45},"Core Concepts","\u002Fdocs\u002Fconcepts","1.docs\u002F2.concepts\u002F1.index",[43,46,51,56,61,66,71,76,81],{"title":44,"path":40,"stem":41,"icon":45},"Core concepts","i-lucide-book-open",{"title":47,"path":48,"stem":49,"icon":50},"Architecture","\u002Fdocs\u002Fconcepts\u002Farchitecture","1.docs\u002F2.concepts\u002F2.architecture","i-lucide-layers",{"title":52,"path":53,"stem":54,"icon":55},"Exactly-once semantics","\u002Fdocs\u002Fconcepts\u002Fexactly-once","1.docs\u002F2.concepts\u002F3.exactly-once","i-lucide-shield-check",{"title":57,"path":58,"stem":59,"icon":60},"Lanes and parallelism","\u002Fdocs\u002Fconcepts\u002Flanes-and-parallelism","1.docs\u002F2.concepts\u002F4.lanes-and-parallelism","i-lucide-split",{"title":62,"path":63,"stem":64,"icon":65},"State and thread-safety","\u002Fdocs\u002Fconcepts\u002Fstate-and-thread-safety","1.docs\u002F2.concepts\u002F5.state-and-thread-safety","i-lucide-lock",{"title":67,"path":68,"stem":69,"icon":70},"Event time and watermarks","\u002Fdocs\u002Fconcepts\u002Fevent-time-and-watermarks","1.docs\u002F2.concepts\u002F6.event-time-and-watermarks","i-lucide-clock",{"title":72,"path":73,"stem":74,"icon":75},"The configuration model","\u002Fdocs\u002Fconcepts\u002Fconfiguration-model","1.docs\u002F2.concepts\u002F7.configuration-model","i-lucide-sliders-horizontal",{"title":77,"path":78,"stem":79,"icon":80},"The error-handling model","\u002Fdocs\u002Fconcepts\u002Ferror-handling-model","1.docs\u002F2.concepts\u002F8.error-handling-model","i-lucide-triangle-alert",{"title":82,"path":83,"stem":84,"icon":85},"How StoatFlow differs from Kafka Streams","\u002Fdocs\u002Fconcepts\u002Fhow-stoatflow-differs-from-ks","1.docs\u002F2.concepts\u002F9.how-stoatflow-differs-from-ks","i-lucide-arrow-left-right",{"title":87,"path":88,"stem":89,"children":90,"icon":93},"Building Topologies","\u002Fdocs\u002Fbuilding","1.docs\u002F3.building\u002F1.index",[91,94,99,104,109,114,119,124,129,134,139,144],{"title":92,"path":88,"stem":89,"icon":93},"Building topologies","i-lucide-blocks",{"title":95,"path":96,"stem":97,"icon":98},"Error handling and DLQ","\u002Fdocs\u002Fbuilding\u002Ferror-handling-dlq","1.docs\u002F3.building\u002F10.error-handling-dlq","i-lucide-circle-x",{"title":100,"path":101,"stem":102,"icon":103},"State stores","\u002Fdocs\u002Fbuilding\u002Fstate-stores","1.docs\u002F3.building\u002F11.state-stores","i-lucide-database",{"title":105,"path":106,"stem":107,"icon":108},"Testing topologies","\u002Fdocs\u002Fbuilding\u002Ftesting","1.docs\u002F3.building\u002F12.testing","i-lucide-flask-conical",{"title":110,"path":111,"stem":112,"icon":113},"Sources and sinks","\u002Fdocs\u002Fbuilding\u002Fstreams-builder","1.docs\u002F3.building\u002F2.streams-builder","i-lucide-import",{"title":115,"path":116,"stem":117,"icon":118},"KStream and KTable operations","\u002Fdocs\u002Fbuilding\u002Fkstream-ktable","1.docs\u002F3.building\u002F3.kstream-ktable","i-lucide-waypoints",{"title":120,"path":121,"stem":122,"icon":123},"Aggregations","\u002Fdocs\u002Fbuilding\u002Faggregations","1.docs\u002F3.building\u002F4.aggregations","i-lucide-sigma",{"title":125,"path":126,"stem":127,"icon":128},"Windowing","\u002Fdocs\u002Fbuilding\u002Fwindowing","1.docs\u002F3.building\u002F5.windowing","i-lucide-calendar-clock",{"title":130,"path":131,"stem":132,"icon":133},"Joins","\u002Fdocs\u002Fbuilding\u002Fjoins","1.docs\u002F3.building\u002F6.joins","i-lucide-git-merge",{"title":135,"path":136,"stem":137,"icon":138},"The Processor API","\u002Fdocs\u002Fbuilding\u002Fprocessor-api","1.docs\u002F3.building\u002F7.processor-api","i-lucide-cpu",{"title":140,"path":141,"stem":142,"icon":143},"Scheduled sources","\u002Fdocs\u002Fbuilding\u002Fscheduled-sources","1.docs\u002F3.building\u002F8.scheduled-sources","i-lucide-timer",{"title":145,"path":146,"stem":147,"icon":148},"Serdes and Avro","\u002Fdocs\u002Fbuilding\u002Fserdes","1.docs\u002F3.building\u002F9.serdes","i-lucide-binary",{"title":150,"path":151,"stem":152,"children":153,"icon":75},"Configuration","\u002Fdocs\u002Fconfiguration","1.docs\u002F4.configuration\u002F1.index",[154,156,161,166,171],{"title":155,"path":151,"stem":152,"icon":75},"How configuration works",{"title":157,"path":158,"stem":159,"icon":160},"Engine configuration (:core)","\u002Fdocs\u002Fconfiguration\u002Fcore-config","1.docs\u002F4.configuration\u002F2.core-config","i-lucide-settings-2",{"title":162,"path":163,"stem":164,"icon":165},"Runtime configuration (:runtime)","\u002Fdocs\u002Fconfiguration\u002Fruntime-config","1.docs\u002F4.configuration\u002F3.runtime-config","i-lucide-server-cog",{"title":167,"path":168,"stem":169,"icon":170},"Defaults, adaptivity, and presets","\u002Fdocs\u002Fconfiguration\u002Fdefaults-and-presets","1.docs\u002F4.configuration\u002F4.defaults-and-presets","i-lucide-gauge",{"title":172,"path":173,"stem":174,"icon":175},"Kafka client configuration","\u002Fdocs\u002Fconfiguration\u002Fkafka-client-config","1.docs\u002F4.configuration\u002F5.kafka-client-config","i-lucide-plug",{"title":177,"path":178,"stem":179,"children":180,"icon":183},"Running in Production","\u002Fdocs\u002Fruntime","1.docs\u002F5.runtime\u002F1.index",[181,184,189,194,199,204,209,214],{"title":182,"path":178,"stem":179,"icon":183},"The runtime","i-lucide-server",{"title":185,"path":186,"stem":187,"icon":188},"The REST API","\u002Fdocs\u002Fruntime\u002Frest-api","1.docs\u002F5.runtime\u002F2.rest-api","i-lucide-globe",{"title":190,"path":191,"stem":192,"icon":193},"Health checks","\u002Fdocs\u002Fruntime\u002Fhealth-checks","1.docs\u002F5.runtime\u002F3.health-checks","i-lucide-heart-pulse",{"title":195,"path":196,"stem":197,"icon":198},"Metrics","\u002Fdocs\u002Fruntime\u002Fmetrics","1.docs\u002F5.runtime\u002F4.metrics","i-lucide-activity",{"title":200,"path":201,"stem":202,"icon":203},"Pause and resume","\u002Fdocs\u002Fruntime\u002Fpause-unpause","1.docs\u002F5.runtime\u002F5.pause-unpause","i-lucide-pause",{"title":205,"path":206,"stem":207,"icon":208},"Plugins and lifecycle hooks","\u002Fdocs\u002Fruntime\u002Fplugins","1.docs\u002F5.runtime\u002F6.plugins","i-lucide-puzzle",{"title":210,"path":211,"stem":212,"icon":213},"Docker images","\u002Fdocs\u002Fruntime\u002Fdocker","1.docs\u002F5.runtime\u002F7.docker","i-lucide-container",{"title":215,"path":216,"stem":217,"icon":218},"GraalVM native image","\u002Fdocs\u002Fruntime\u002Fnative-image","1.docs\u002F5.runtime\u002F8.native-image","i-lucide-zap",{"title":220,"path":221,"stem":222,"children":223,"icon":226},"Deploying & Operating","\u002Fdocs\u002Foperating","1.docs\u002F6.operating\u002F1.index",[224,227,232,237,242,247,252],{"title":225,"path":221,"stem":222,"icon":226},"Deploying and operating","i-lucide-life-buoy",{"title":228,"path":229,"stem":230,"icon":231},"Running on Kubernetes","\u002Fdocs\u002Foperating\u002Fkubernetes","1.docs\u002F6.operating\u002F2.kubernetes","i-lucide-ship",{"title":233,"path":234,"stem":235,"icon":236},"High availability","\u002Fdocs\u002Foperating\u002Fhigh-availability","1.docs\u002F6.operating\u002F3.high-availability","i-lucide-copy",{"title":238,"path":239,"stem":240,"icon":241},"Liveness and readiness probes","\u002Fdocs\u002Foperating\u002Fprobes","1.docs\u002F6.operating\u002F4.probes","i-lucide-stethoscope",{"title":243,"path":244,"stem":245,"icon":246},"Observability","\u002Fdocs\u002Foperating\u002Fobservability","1.docs\u002F6.operating\u002F5.observability","i-lucide-telescope",{"title":248,"path":249,"stem":250,"icon":251},"Tuning under load","\u002Fdocs\u002Foperating\u002Ftuning","1.docs\u002F6.operating\u002F6.tuning","i-lucide-sliders",{"title":253,"path":254,"stem":255,"icon":256},"Production checklist","\u002Fdocs\u002Foperating\u002Fproduction-checklist","1.docs\u002F6.operating\u002F7.production-checklist","i-lucide-clipboard-check",{"title":258,"path":259,"stem":260,"children":261,"icon":85},"Migrating from Kafka Streams","\u002Fdocs\u002Fmigration","1.docs\u002F7.migration\u002F1.index",[262,263,268],{"title":258,"path":259,"stem":260,"icon":85},{"title":264,"path":265,"stem":266,"icon":267},"Migration without carrying state","\u002Fdocs\u002Fmigration\u002Fwithout-data-migration","1.docs\u002F7.migration\u002F2.without-data-migration","i-lucide-sparkles",{"title":269,"path":270,"stem":271,"icon":272},"Migration carrying state","\u002Fdocs\u002Fmigration\u002Fwith-data-migration","1.docs\u002F7.migration\u002F3.with-data-migration","i-lucide-database-backup",{"title":274,"path":275,"stem":276,"children":277,"icon":279},"Reference","\u002Fdocs\u002Freference","1.docs\u002F8.reference\u002F1.index",[278,280,285,290,295,300,305,309],{"title":274,"path":275,"stem":276,"icon":279},"i-lucide-list",{"title":281,"path":282,"stem":283,"icon":284},"Configuration reference","\u002Fdocs\u002Freference\u002Fconfiguration-reference","1.docs\u002F8.reference\u002F2.configuration-reference","i-lucide-table",{"title":286,"path":287,"stem":288,"icon":289},"REST API reference","\u002Fdocs\u002Freference\u002Frest-api-reference","1.docs\u002F8.reference\u002F3.rest-api-reference","i-lucide-network",{"title":291,"path":292,"stem":293,"icon":294},"Gradle plugin reference","\u002Fdocs\u002Freference\u002Fgradle-plugin-reference","1.docs\u002F8.reference\u002F4.gradle-plugin-reference","i-lucide-box",{"title":296,"path":297,"stem":298,"icon":299},"Maven reference","\u002Fdocs\u002Freference\u002Fmaven-reference","1.docs\u002F8.reference\u002F5.maven-reference","i-simple-icons-apachemaven",{"title":301,"path":302,"stem":303,"icon":304},"Kafka Streams compatibility matrix","\u002Fdocs\u002Freference\u002Fks-compatibility-matrix","1.docs\u002F8.reference\u002F6.ks-compatibility-matrix","i-lucide-table-2",{"title":306,"path":307,"stem":308,"icon":170},"Metrics reference","\u002Fdocs\u002Freference\u002Fmetrics-reference","1.docs\u002F8.reference\u002F7.metrics-reference",{"title":310,"path":311,"stem":312,"icon":313},"Glossary","\u002Fdocs\u002Freference\u002Fglossary","1.docs\u002F8.reference\u002F8.glossary","i-lucide-book-a",{"id":315,"title":115,"body":316,"description":5857,"extension":5858,"meta":5859,"navigation":5860,"pageType":5861,"path":116,"seo":5862,"stem":117,"__hash__":5863},"docs\u002F1.docs\u002F3.building\u002F3.kstream-ktable.md",{"type":317,"value":318,"toc":5827},"minimark",[319,339,352,454,459,472,616,624,628,645,667,670,676,681,1105,1119,1125,1138,1465,1473,1481,1795,1803,1808,2176,2189,2541,2547,2560,2756,2762,2771,2990,2999,3005,3016,3142,3148,3193,3206,3850,3863,3867,3880,3888,3904,3923,4216,4222,4249,4478,4488,4495,4503,4796,4800,4807,5767,5771,5823],[320,321,322,326,327,330,331,334,335,338],"p",{},[323,324,325],"code",{},"KStream\u003CK, V>"," is an unbounded stream of records; ",[323,328,329],{},"KTable\u003CK, V>"," is a changelog table holding one value per key. This page covers the stateless ",[323,332,333],{},"KStream"," transforms and the basic ",[323,336,337],{},"KTable"," operations. Aggregations, joins, windowing, and the Processor API have their own pages.",[320,340,341,342,348,349,351],{},"Both types are created through the ",[343,344,345],"a",{"href":111},[323,346,347],{},"StreamsBuilder",", never constructed directly. The operators are Kafka Streams compatible — Java code written against the KS DSL compiles against StoatFlow with no changes (see the ",[343,350,301],{"href":302},").",[353,354,355],"tldr-panel",{},[356,357,358,401,421,444],"ul",{},[359,360,361,368,369,372,373,372,376,372,379,372,382,372,385,372,388,372,391,372,394,372,397,400],"li",{},[362,363,364,365,367],"strong",{},"Stateless ",[323,366,333],{}," transforms:"," ",[323,370,371],{},"mapValues",", ",[323,374,375],{},"map",[323,377,378],{},"filter",[323,380,381],{},"filterNot",[323,383,384],{},"flatMapValues",[323,386,387],{},"flatMap",[323,389,390],{},"selectKey",[323,392,393],{},"peek",[323,395,396],{},"merge",[323,398,399],{},"split",".",[359,402,403,368,408,372,410,372,412,372,414,417,418,400],{},[362,404,405,407],{},[323,406,337],{}," basics:",[323,409,371],{},[323,411,378],{},[323,413,381],{},[323,415,416],{},"toStream",", plus ",[323,419,420],{},"KStream.toTable",[359,422,423,368,426,372,428,372,430,432,433,436,437,372,439,432,441,443],{},[362,424,425],{},"Re-keying:",[323,427,375],{},[323,429,387],{},[323,431,390],{},", and ",[323,434,435],{},"groupBy"," change the key — records are re-routed to the lane that owns the new key. ",[323,438,371],{},[323,440,378],{},[323,442,393],{}," preserve the key and stay on the same lane.",[359,445,446,449,450,453],{},[362,447,448],{},"Every operator"," takes an optional trailing ",[323,451,452],{},"Named"," to give the node a stable name.",[455,456,458],"h2",{"id":457},"two-kinds-of-operator-value-preserving-vs-key-changing","Two kinds of operator: value-preserving vs key-changing",[320,460,461,462,465,466,468,469,471],{},"The single most important distinction in this API is whether an operator changes the ",[362,463,464],{},"key",". StoatFlow routes every record to a processing lane by key affinity — same key, same lane, in order. An operator that changes the key forces the record to be re-routed to whichever lane owns the new key. (This is StoatFlow's in-memory equivalent of a Kafka Streams repartition topic — no broker round-trip. See ",[343,467,57],{"href":58}," and ",[343,470,47],{"href":48},".)",[473,474,475,491],"table",{},[476,477,478],"thead",{},[479,480,481,485,488],"tr",{},[482,483,484],"th",{},"Operator",[482,486,487],{},"Changes key?",[482,489,490],{},"Effect",[492,493,494,507,520,531,542,553,564,578,591,603],"tbody",{},[479,495,496,501,504],{},[497,498,499],"td",{},[323,500,371],{},[497,502,503],{},"No",[497,505,506],{},"Stays on the same lane",[479,508,509,516,518],{},[497,510,511,513,514],{},[323,512,378],{}," \u002F ",[323,515,381],{},[497,517,503],{},[497,519,506],{},[479,521,522,526,528],{},[497,523,524],{},[323,525,384],{},[497,527,503],{},[497,529,530],{},"All output records keep the input key",[479,532,533,537,539],{},[497,534,535],{},[323,536,393],{},[497,538,503],{},[497,540,541],{},"Pure side effect",[479,543,544,548,550],{},[497,545,546],{},[323,547,396],{},[497,549,503],{},[497,551,552],{},"Records keep their original key affinity",[479,554,555,559,561],{},[497,556,557],{},[323,558,399],{},[497,560,503],{},[497,562,563],{},"Routing only — keys unchanged",[479,565,566,570,575],{},[497,567,568],{},[323,569,375],{},[497,571,572],{},[362,573,574],{},"Yes",[497,576,577],{},"Re-routed by new key",[479,579,580,584,588],{},[497,581,582],{},[323,583,387],{},[497,585,586],{},[362,587,574],{},[497,589,590],{},"Each output re-routed by its key",[479,592,593,597,601],{},[497,594,595],{},[323,596,390],{},[497,598,599],{},[362,600,574],{},[497,602,577],{},[479,604,605,609,613],{},[497,606,607],{},[323,608,435],{},[497,610,611],{},[362,612,574],{},[497,614,615],{},"Re-keys, then groups",[320,617,618,619,372,621,623],{},"Prefer the value-only operators (",[323,620,371],{},[323,622,384],{},") when you don't need to change the key — they avoid re-routing entirely.",[455,625,627],{"id":626},"naming-operators","Naming operators",[320,629,630,631,633,634,637,638,641,642,400],{},"Every operator accepts an optional trailing ",[323,632,452],{}," parameter. StoatFlow uses these stable names for the topology graph, metrics, and (for stateful operators) state-store identity. In Kotlin ",[323,635,636],{},"as"," is a soft keyword, so escape it with backticks: ",[323,639,640],{},"Named.`as`(\"uppercase\")",". In Java it's a plain method: ",[323,643,644],{},"Named.as(\"uppercase\")",[646,647,652],"pre",{"className":648,"code":649,"language":650,"meta":651,"style":651},"language-kotlin shiki shiki-themes vitesse-light","import io.stoatflow.core.topology.Named\n","kotlin","",[323,653,654],{"__ignoreMap":651},[655,656,659,663],"span",{"class":657,"line":658},"line",1,[655,660,662],{"class":661},"sbBg2","import",[655,664,666],{"class":665},"sySUi"," io.stoatflow.core.topology.Named\n",[320,668,669],{},"Naming is optional but recommended — unnamed nodes get auto-generated names that change as you edit the topology.",[455,671,673,674],{"id":672},"value-transforms-mapvalues","Value transforms — ",[323,675,371],{},[320,677,678,680],{},[323,679,371],{}," transforms each value and keeps the key. There's a value-only form and a key-aware form (the key is read-only — it is not changed).",[682,683,685,803],"code-tabs",{"group":684},"lang",[646,686,689],{"className":648,"code":687,"filename":688,"language":650,"meta":651,"style":651},"import io.stoatflow.core.topology.Named\n\n\u002F\u002F value-only\nval upper = stream.mapValues({ v -> v.uppercase() }, Named.`as`(\"uppercase\"))\n\n\u002F\u002F key-aware (key is read-only)\nval tagged = stream.mapValues({ k, v -> \"$k:$v\" }, Named.`as`(\"tag-with-key\"))\n","Kotlin",[323,690,691,697,704,711,758,763,769],{"__ignoreMap":651},[655,692,693,695],{"class":657,"line":658},[655,694,662],{"class":661},[655,696,666],{"class":665},[655,698,700],{"class":657,"line":699},2,[655,701,703],{"emptyLinePlaceholder":702},true,"\n",[655,705,707],{"class":657,"line":706},3,[655,708,710],{"class":709},"s8zF2","\u002F\u002F value-only\n",[655,712,714,717,721,725,728,730,733,736,739,742,745,748,751,755],{"class":657,"line":713},4,[655,715,716],{"class":661},"val",[655,718,720],{"class":719},"suHK_"," upper ",[655,722,724],{"class":723},"sYZai","=",[655,726,727],{"class":719}," stream.",[655,729,371],{"class":665},[655,731,732],{"class":719},"({ v ",[655,734,735],{"class":723},"->",[655,737,738],{"class":719}," v.",[655,740,741],{"class":665},"uppercase",[655,743,744],{"class":719},"() }, Named.",[655,746,747],{"class":665},"`as`",[655,749,750],{"class":719},"(",[655,752,754],{"class":753},"spphp","\"uppercase\"",[655,756,757],{"class":719},"))\n",[655,759,761],{"class":657,"line":760},5,[655,762,703],{"emptyLinePlaceholder":702},[655,764,766],{"class":657,"line":765},6,[655,767,768],{"class":709},"\u002F\u002F key-aware (key is read-only)\n",[655,770,772,774,777,779,781,783,786,788,791,794,796,798,801],{"class":657,"line":771},7,[655,773,716],{"class":661},[655,775,776],{"class":719}," tagged ",[655,778,724],{"class":723},[655,780,727],{"class":719},[655,782,371],{"class":665},[655,784,785],{"class":719},"({ k, v ",[655,787,735],{"class":723},[655,789,790],{"class":753}," \"$k:$v\"",[655,792,793],{"class":719}," }, Named.",[655,795,747],{"class":665},[655,797,750],{"class":719},[655,799,800],{"class":753},"\"tag-with-key\"",[655,802,757],{"class":719},[646,804,809],{"className":805,"code":806,"filename":807,"language":808,"meta":651,"style":651},"language-java shiki shiki-themes vitesse-light","import io.stoatflow.core.topology.Named;\nimport io.stoatflow.core.topology.ValueMapper;\nimport io.stoatflow.core.topology.ValueMapperWithKey;\n\n\u002F\u002F value-only\nKStream\u003CString, String> upper =\n    stream.mapValues((ValueMapper\u003CString, String>) v -> v.toUpperCase(), Named.as(\"uppercase\"));\n\n\u002F\u002F key-aware (key is read-only)\nKStream\u003CString, String> tagged =\n    stream.mapValues((ValueMapperWithKey\u003CString, String, String>) (k, v) -> k + \":\" + v,\n        Named.as(\"tag-with-key\"));\n","Java","java",[323,810,811,840,865,890,894,898,925,988,993,998,1018,1084],{"__ignoreMap":651},[655,812,813,815,818,820,823,825,828,830,833,835,837],{"class":657,"line":658},[655,814,662],{"class":661},[655,816,817],{"class":719}," io",[655,819,400],{"class":723},[655,821,822],{"class":719},"stoatflow",[655,824,400],{"class":723},[655,826,827],{"class":719},"core",[655,829,400],{"class":723},[655,831,832],{"class":719},"topology",[655,834,400],{"class":723},[655,836,452],{"class":719},[655,838,839],{"class":723},";\n",[655,841,842,844,846,848,850,852,854,856,858,860,863],{"class":657,"line":699},[655,843,662],{"class":661},[655,845,817],{"class":719},[655,847,400],{"class":723},[655,849,822],{"class":719},[655,851,400],{"class":723},[655,853,827],{"class":719},[655,855,400],{"class":723},[655,857,832],{"class":719},[655,859,400],{"class":723},[655,861,862],{"class":719},"ValueMapper",[655,864,839],{"class":723},[655,866,867,869,871,873,875,877,879,881,883,885,888],{"class":657,"line":706},[655,868,662],{"class":661},[655,870,817],{"class":719},[655,872,400],{"class":723},[655,874,822],{"class":719},[655,876,400],{"class":723},[655,878,827],{"class":719},[655,880,400],{"class":723},[655,882,832],{"class":719},[655,884,400],{"class":723},[655,886,887],{"class":719},"ValueMapperWithKey",[655,889,839],{"class":723},[655,891,892],{"class":657,"line":713},[655,893,703],{"emptyLinePlaceholder":702},[655,895,896],{"class":657,"line":760},[655,897,710],{"class":709},[655,899,900,902,905,909,912,915,918,922],{"class":657,"line":765},[655,901,333],{"class":719},[655,903,904],{"class":723},"\u003C",[655,906,908],{"class":907},"si04Y","String",[655,910,911],{"class":723},",",[655,913,914],{"class":907}," String",[655,916,917],{"class":723},">",[655,919,921],{"class":920},"svycV"," upper",[655,923,924],{"class":723}," =\n",[655,926,927,930,932,934,937,939,941,943,945,947,949,952,955,957,960,962,965,968,971,973,975,977,981,983,985],{"class":657,"line":771},[655,928,929],{"class":920},"    stream",[655,931,400],{"class":723},[655,933,371],{"class":665},[655,935,936],{"class":723},"((",[655,938,862],{"class":719},[655,940,904],{"class":907},[655,942,908],{"class":719},[655,944,911],{"class":723},[655,946,914],{"class":719},[655,948,917],{"class":907},[655,950,951],{"class":723},")",[655,953,954],{"class":719}," v ",[655,956,735],{"class":723},[655,958,959],{"class":920}," v",[655,961,400],{"class":723},[655,963,964],{"class":665},"toUpperCase",[655,966,967],{"class":723},"(),",[655,969,970],{"class":920}," Named",[655,972,400],{"class":723},[655,974,636],{"class":665},[655,976,750],{"class":723},[655,978,980],{"class":979},"sSP4y","\"",[655,982,741],{"class":753},[655,984,980],{"class":979},[655,986,987],{"class":723},"));\n",[655,989,991],{"class":657,"line":990},8,[655,992,703],{"emptyLinePlaceholder":702},[655,994,996],{"class":657,"line":995},9,[655,997,768],{"class":709},[655,999,1001,1003,1005,1007,1009,1011,1013,1016],{"class":657,"line":1000},10,[655,1002,333],{"class":719},[655,1004,904],{"class":723},[655,1006,908],{"class":907},[655,1008,911],{"class":723},[655,1010,914],{"class":907},[655,1012,917],{"class":723},[655,1014,1015],{"class":920}," tagged",[655,1017,924],{"class":723},[655,1019,1021,1023,1025,1027,1029,1031,1033,1035,1037,1039,1041,1043,1045,1047,1050,1053,1055,1057,1059,1062,1065,1068,1071,1074,1076,1079,1081],{"class":657,"line":1020},11,[655,1022,929],{"class":920},[655,1024,400],{"class":723},[655,1026,371],{"class":665},[655,1028,936],{"class":723},[655,1030,887],{"class":719},[655,1032,904],{"class":907},[655,1034,908],{"class":719},[655,1036,911],{"class":723},[655,1038,914],{"class":719},[655,1040,911],{"class":723},[655,1042,914],{"class":719},[655,1044,917],{"class":907},[655,1046,951],{"class":723},[655,1048,1049],{"class":723}," (",[655,1051,1052],{"class":719},"k",[655,1054,911],{"class":723},[655,1056,959],{"class":719},[655,1058,951],{"class":723},[655,1060,1061],{"class":723}," ->",[655,1063,1064],{"class":719}," k ",[655,1066,1067],{"class":907},"+",[655,1069,1070],{"class":979}," \"",[655,1072,1073],{"class":753},":",[655,1075,980],{"class":979},[655,1077,1078],{"class":907}," +",[655,1080,959],{"class":719},[655,1082,1083],{"class":723},",\n",[655,1085,1087,1090,1092,1094,1096,1098,1101,1103],{"class":657,"line":1086},12,[655,1088,1089],{"class":920},"        Named",[655,1091,400],{"class":723},[655,1093,636],{"class":665},[655,1095,750],{"class":723},[655,1097,980],{"class":979},[655,1099,1100],{"class":753},"tag-with-key",[655,1102,980],{"class":979},[655,1104,987],{"class":723},[1106,1107,1109],"callout",{"color":1108,"icon":80},"warning",[320,1110,1111,1112,1115,1116,1118],{},"Values may be ",[323,1113,1114],{},"null"," (a tombstone). Your mapper, predicate, and action functions must handle ",[323,1117,1114],{}," values — StoatFlow does not filter them out for you.",[455,1120,1122,1123],{"id":1121},"key-value-transform-map","Key + value transform — ",[323,1124,375],{},[320,1126,1127,1129,1130,1133,1134,1137],{},[323,1128,375],{}," returns a ",[323,1131,1132],{},"KeyValue\u003CKR, VR>",", replacing both key and value. ",[362,1135,1136],{},"This is a key-changing operation"," — the output is re-routed to the lane that owns the new key.",[682,1139,1140,1240],{"group":684},[646,1141,1143],{"className":648,"code":1142,"filename":688,"language":650,"meta":651,"style":651},"import io.stoatflow.core.state.KeyValue\nimport io.stoatflow.core.topology.Named\n\nval rekeyed = stream.map(\n    { key, value -> KeyValue(value.substring(0, 3), \"$key:$value\") },\n    Named.`as`(\"rekey-by-prefix\"),\n)\n",[323,1144,1145,1152,1158,1162,1178,1220,1235],{"__ignoreMap":651},[655,1146,1147,1149],{"class":657,"line":658},[655,1148,662],{"class":661},[655,1150,1151],{"class":665}," io.stoatflow.core.state.KeyValue\n",[655,1153,1154,1156],{"class":657,"line":699},[655,1155,662],{"class":661},[655,1157,666],{"class":665},[655,1159,1160],{"class":657,"line":706},[655,1161,703],{"emptyLinePlaceholder":702},[655,1163,1164,1166,1169,1171,1173,1175],{"class":657,"line":713},[655,1165,716],{"class":661},[655,1167,1168],{"class":719}," rekeyed ",[655,1170,724],{"class":723},[655,1172,727],{"class":719},[655,1174,375],{"class":665},[655,1176,1177],{"class":719},"(\n",[655,1179,1180,1183,1186,1188,1191,1193,1195,1197,1200,1202,1206,1208,1211,1214,1217],{"class":657,"line":760},[655,1181,1182],{"class":719},"    { key, ",[655,1184,1185],{"class":907},"value",[655,1187,1061],{"class":723},[655,1189,1190],{"class":665}," KeyValue",[655,1192,750],{"class":719},[655,1194,1185],{"class":907},[655,1196,400],{"class":719},[655,1198,1199],{"class":665},"substring",[655,1201,750],{"class":719},[655,1203,1205],{"class":1204},"s-TwI","0",[655,1207,372],{"class":719},[655,1209,1210],{"class":1204},"3",[655,1212,1213],{"class":719},"), ",[655,1215,1216],{"class":753},"\"$key:$value\"",[655,1218,1219],{"class":719},") },\n",[655,1221,1222,1225,1227,1229,1232],{"class":657,"line":765},[655,1223,1224],{"class":719},"    Named.",[655,1226,747],{"class":665},[655,1228,750],{"class":719},[655,1230,1231],{"class":753},"\"rekey-by-prefix\"",[655,1233,1234],{"class":719},"),\n",[655,1236,1237],{"class":657,"line":771},[655,1238,1239],{"class":719},")\n",[646,1241,1243],{"className":805,"code":1242,"filename":807,"language":808,"meta":651,"style":651},"import io.stoatflow.core.state.KeyValue;\nimport io.stoatflow.core.topology.KeyValueMapper;\nimport io.stoatflow.core.topology.Named;\n\nKStream\u003CString, String> rekeyed = stream.map(\n    (KeyValueMapper\u003CLong, String, KeyValue\u003CString, String>>) (key, value) ->\n        new KeyValue\u003C>(value.substring(0, 3), key + \":\" + value),\n    Named.as(\"rekey-by-prefix\"));\n",[323,1244,1245,1271,1296,1320,1324,1353,1400,1445],{"__ignoreMap":651},[655,1246,1247,1249,1251,1253,1255,1257,1259,1261,1264,1266,1269],{"class":657,"line":658},[655,1248,662],{"class":661},[655,1250,817],{"class":719},[655,1252,400],{"class":723},[655,1254,822],{"class":719},[655,1256,400],{"class":723},[655,1258,827],{"class":719},[655,1260,400],{"class":723},[655,1262,1263],{"class":719},"state",[655,1265,400],{"class":723},[655,1267,1268],{"class":719},"KeyValue",[655,1270,839],{"class":723},[655,1272,1273,1275,1277,1279,1281,1283,1285,1287,1289,1291,1294],{"class":657,"line":699},[655,1274,662],{"class":661},[655,1276,817],{"class":719},[655,1278,400],{"class":723},[655,1280,822],{"class":719},[655,1282,400],{"class":723},[655,1284,827],{"class":719},[655,1286,400],{"class":723},[655,1288,832],{"class":719},[655,1290,400],{"class":723},[655,1292,1293],{"class":719},"KeyValueMapper",[655,1295,839],{"class":723},[655,1297,1298,1300,1302,1304,1306,1308,1310,1312,1314,1316,1318],{"class":657,"line":706},[655,1299,662],{"class":661},[655,1301,817],{"class":719},[655,1303,400],{"class":723},[655,1305,822],{"class":719},[655,1307,400],{"class":723},[655,1309,827],{"class":719},[655,1311,400],{"class":723},[655,1313,832],{"class":719},[655,1315,400],{"class":723},[655,1317,452],{"class":719},[655,1319,839],{"class":723},[655,1321,1322],{"class":657,"line":713},[655,1323,703],{"emptyLinePlaceholder":702},[655,1325,1326,1328,1330,1332,1334,1336,1338,1341,1344,1347,1349,1351],{"class":657,"line":760},[655,1327,333],{"class":719},[655,1329,904],{"class":723},[655,1331,908],{"class":907},[655,1333,911],{"class":723},[655,1335,914],{"class":907},[655,1337,917],{"class":723},[655,1339,1340],{"class":920}," rekeyed",[655,1342,1343],{"class":723}," =",[655,1345,1346],{"class":920}," stream",[655,1348,400],{"class":723},[655,1350,375],{"class":665},[655,1352,1177],{"class":723},[655,1354,1355,1358,1360,1362,1365,1367,1369,1371,1373,1375,1377,1379,1381,1384,1386,1388,1390,1392,1395,1397],{"class":657,"line":765},[655,1356,1357],{"class":723},"    (",[655,1359,1293],{"class":719},[655,1361,904],{"class":907},[655,1363,1364],{"class":719},"Long",[655,1366,911],{"class":723},[655,1368,914],{"class":719},[655,1370,911],{"class":723},[655,1372,1190],{"class":719},[655,1374,904],{"class":907},[655,1376,908],{"class":719},[655,1378,911],{"class":723},[655,1380,914],{"class":719},[655,1382,1383],{"class":907},">>",[655,1385,951],{"class":723},[655,1387,1049],{"class":723},[655,1389,464],{"class":719},[655,1391,911],{"class":723},[655,1393,1394],{"class":719}," value",[655,1396,951],{"class":723},[655,1398,1399],{"class":723}," ->\n",[655,1401,1402,1405,1407,1410,1412,1414,1416,1418,1420,1422,1425,1428,1431,1433,1435,1437,1439,1441,1443],{"class":657,"line":771},[655,1403,1404],{"class":661},"        new",[655,1406,1190],{"class":719},[655,1408,1409],{"class":723},"\u003C>(",[655,1411,1185],{"class":920},[655,1413,400],{"class":723},[655,1415,1199],{"class":665},[655,1417,750],{"class":723},[655,1419,1205],{"class":1204},[655,1421,911],{"class":723},[655,1423,1424],{"class":1204}," 3",[655,1426,1427],{"class":723},"),",[655,1429,1430],{"class":719}," key ",[655,1432,1067],{"class":907},[655,1434,1070],{"class":979},[655,1436,1073],{"class":753},[655,1438,980],{"class":979},[655,1440,1078],{"class":907},[655,1442,1394],{"class":719},[655,1444,1234],{"class":723},[655,1446,1447,1450,1452,1454,1456,1458,1461,1463],{"class":657,"line":990},[655,1448,1449],{"class":920},"    Named",[655,1451,400],{"class":723},[655,1453,636],{"class":665},[655,1455,750],{"class":723},[655,1457,980],{"class":979},[655,1459,1460],{"class":753},"rekey-by-prefix",[655,1462,980],{"class":979},[655,1464,987],{"class":723},[455,1466,1468,1469,468,1471],{"id":1467},"filtering-filter-and-filternot","Filtering — ",[323,1470,378],{},[323,1472,381],{},[320,1474,1475,1477,1478,1480],{},[323,1476,378],{}," keeps records that match the predicate; ",[323,1479,381],{}," keeps records that don't. Neither changes the key.",[682,1482,1483,1568],{"group":684},[646,1484,1486],{"className":648,"code":1485,"filename":688,"language":650,"meta":651,"style":651},"import io.stoatflow.core.topology.Named\n\nval longEnough = stream.filter({ _, v -> v.length > 5 }, Named.`as`(\"keep-long\"))\nval notEmpty = stream.filterNot({ _, v -> v.isEmpty() }, Named.`as`(\"drop-empty\"))\n",[323,1487,1488,1494,1498,1535],{"__ignoreMap":651},[655,1489,1490,1492],{"class":657,"line":658},[655,1491,662],{"class":661},[655,1493,666],{"class":665},[655,1495,1496],{"class":657,"line":699},[655,1497,703],{"emptyLinePlaceholder":702},[655,1499,1500,1502,1505,1507,1509,1511,1514,1516,1519,1521,1524,1526,1528,1530,1533],{"class":657,"line":706},[655,1501,716],{"class":661},[655,1503,1504],{"class":719}," longEnough ",[655,1506,724],{"class":723},[655,1508,727],{"class":719},[655,1510,378],{"class":665},[655,1512,1513],{"class":719},"({ _, v ",[655,1515,735],{"class":723},[655,1517,1518],{"class":719}," v.length ",[655,1520,917],{"class":907},[655,1522,1523],{"class":1204}," 5",[655,1525,793],{"class":719},[655,1527,747],{"class":665},[655,1529,750],{"class":719},[655,1531,1532],{"class":753},"\"keep-long\"",[655,1534,757],{"class":719},[655,1536,1537,1539,1542,1544,1546,1548,1550,1552,1554,1557,1559,1561,1563,1566],{"class":657,"line":713},[655,1538,716],{"class":661},[655,1540,1541],{"class":719}," notEmpty ",[655,1543,724],{"class":723},[655,1545,727],{"class":719},[655,1547,381],{"class":665},[655,1549,1513],{"class":719},[655,1551,735],{"class":723},[655,1553,738],{"class":719},[655,1555,1556],{"class":665},"isEmpty",[655,1558,744],{"class":719},[655,1560,747],{"class":665},[655,1562,750],{"class":719},[655,1564,1565],{"class":753},"\"drop-empty\"",[655,1567,757],{"class":719},[646,1569,1571],{"className":805,"code":1570,"filename":807,"language":808,"meta":651,"style":651},"import io.stoatflow.core.topology.Named;\nimport io.stoatflow.core.topology.Predicate;\n\nKStream\u003CLong, String> longEnough =\n    stream.filter((Predicate\u003CLong, String>) (k, v) -> v.length() > 5, Named.as(\"keep-long\"));\nKStream\u003CLong, String> notEmpty =\n    stream.filterNot((Predicate\u003CLong, String>) (k, v) -> v.isEmpty(), Named.as(\"drop-empty\"));\n",[323,1572,1573,1597,1622,1626,1645,1715,1734],{"__ignoreMap":651},[655,1574,1575,1577,1579,1581,1583,1585,1587,1589,1591,1593,1595],{"class":657,"line":658},[655,1576,662],{"class":661},[655,1578,817],{"class":719},[655,1580,400],{"class":723},[655,1582,822],{"class":719},[655,1584,400],{"class":723},[655,1586,827],{"class":719},[655,1588,400],{"class":723},[655,1590,832],{"class":719},[655,1592,400],{"class":723},[655,1594,452],{"class":719},[655,1596,839],{"class":723},[655,1598,1599,1601,1603,1605,1607,1609,1611,1613,1615,1617,1620],{"class":657,"line":699},[655,1600,662],{"class":661},[655,1602,817],{"class":719},[655,1604,400],{"class":723},[655,1606,822],{"class":719},[655,1608,400],{"class":723},[655,1610,827],{"class":719},[655,1612,400],{"class":723},[655,1614,832],{"class":719},[655,1616,400],{"class":723},[655,1618,1619],{"class":719},"Predicate",[655,1621,839],{"class":723},[655,1623,1624],{"class":657,"line":706},[655,1625,703],{"emptyLinePlaceholder":702},[655,1627,1628,1630,1632,1634,1636,1638,1640,1643],{"class":657,"line":713},[655,1629,333],{"class":719},[655,1631,904],{"class":723},[655,1633,1364],{"class":907},[655,1635,911],{"class":723},[655,1637,914],{"class":907},[655,1639,917],{"class":723},[655,1641,1642],{"class":920}," longEnough",[655,1644,924],{"class":723},[655,1646,1647,1649,1651,1653,1655,1657,1659,1661,1663,1665,1667,1669,1671,1673,1675,1677,1679,1681,1683,1685,1688,1691,1694,1696,1698,1700,1702,1704,1706,1708,1711,1713],{"class":657,"line":760},[655,1648,929],{"class":920},[655,1650,400],{"class":723},[655,1652,378],{"class":665},[655,1654,936],{"class":723},[655,1656,1619],{"class":719},[655,1658,904],{"class":907},[655,1660,1364],{"class":719},[655,1662,911],{"class":723},[655,1664,914],{"class":719},[655,1666,917],{"class":907},[655,1668,951],{"class":723},[655,1670,1049],{"class":723},[655,1672,1052],{"class":719},[655,1674,911],{"class":723},[655,1676,959],{"class":719},[655,1678,951],{"class":723},[655,1680,1061],{"class":723},[655,1682,959],{"class":920},[655,1684,400],{"class":723},[655,1686,1687],{"class":665},"length",[655,1689,1690],{"class":723},"()",[655,1692,1693],{"class":907}," >",[655,1695,1523],{"class":1204},[655,1697,911],{"class":723},[655,1699,970],{"class":920},[655,1701,400],{"class":723},[655,1703,636],{"class":665},[655,1705,750],{"class":723},[655,1707,980],{"class":979},[655,1709,1710],{"class":753},"keep-long",[655,1712,980],{"class":979},[655,1714,987],{"class":723},[655,1716,1717,1719,1721,1723,1725,1727,1729,1732],{"class":657,"line":765},[655,1718,333],{"class":719},[655,1720,904],{"class":723},[655,1722,1364],{"class":907},[655,1724,911],{"class":723},[655,1726,914],{"class":907},[655,1728,917],{"class":723},[655,1730,1731],{"class":920}," notEmpty",[655,1733,924],{"class":723},[655,1735,1736,1738,1740,1742,1744,1746,1748,1750,1752,1754,1756,1758,1760,1762,1764,1766,1768,1770,1772,1774,1776,1778,1780,1782,1784,1786,1788,1791,1793],{"class":657,"line":771},[655,1737,929],{"class":920},[655,1739,400],{"class":723},[655,1741,381],{"class":665},[655,1743,936],{"class":723},[655,1745,1619],{"class":719},[655,1747,904],{"class":907},[655,1749,1364],{"class":719},[655,1751,911],{"class":723},[655,1753,914],{"class":719},[655,1755,917],{"class":907},[655,1757,951],{"class":723},[655,1759,1049],{"class":723},[655,1761,1052],{"class":719},[655,1763,911],{"class":723},[655,1765,959],{"class":719},[655,1767,951],{"class":723},[655,1769,1061],{"class":723},[655,1771,959],{"class":920},[655,1773,400],{"class":723},[655,1775,1556],{"class":665},[655,1777,967],{"class":723},[655,1779,970],{"class":920},[655,1781,400],{"class":723},[655,1783,636],{"class":665},[655,1785,750],{"class":723},[655,1787,980],{"class":979},[655,1789,1790],{"class":753},"drop-empty",[655,1792,980],{"class":979},[655,1794,987],{"class":723},[455,1796,1798,1799,468,1801],{"id":1797},"one-to-many-flatmapvalues-and-flatmap","One-to-many — ",[323,1800,384],{},[323,1802,387],{},[320,1804,1805,1807],{},[323,1806,384],{}," turns each value into zero or more values, all keeping the input key — value-only, so no re-routing. There's also a key-aware form that reads (but does not change) the key.",[682,1809,1810,1916],{"group":684},[646,1811,1813],{"className":648,"code":1812,"filename":688,"language":650,"meta":651,"style":651},"import io.stoatflow.core.topology.Named\n\nval whitespace = \"\\\\s+\".toRegex()\nval words = lines.flatMapValues(\n    { line -> line.lowercase().split(whitespace).filter { it.isNotBlank() } },\n    Named.`as`(\"split-words\"),\n)\n",[323,1814,1815,1821,1825,1851,1867,1899,1912],{"__ignoreMap":651},[655,1816,1817,1819],{"class":657,"line":658},[655,1818,662],{"class":661},[655,1820,666],{"class":665},[655,1822,1823],{"class":657,"line":699},[655,1824,703],{"emptyLinePlaceholder":702},[655,1826,1827,1829,1832,1834,1836,1840,1843,1845,1848],{"class":657,"line":706},[655,1828,716],{"class":661},[655,1830,1831],{"class":719}," whitespace ",[655,1833,724],{"class":723},[655,1835,1070],{"class":753},[655,1837,1839],{"class":1838},"sEi1f","\\\\",[655,1841,1842],{"class":753},"s+\"",[655,1844,400],{"class":719},[655,1846,1847],{"class":665},"toRegex",[655,1849,1850],{"class":719},"()\n",[655,1852,1853,1855,1858,1860,1863,1865],{"class":657,"line":713},[655,1854,716],{"class":661},[655,1856,1857],{"class":719}," words ",[655,1859,724],{"class":723},[655,1861,1862],{"class":719}," lines.",[655,1864,384],{"class":665},[655,1866,1177],{"class":719},[655,1868,1869,1872,1874,1877,1880,1883,1885,1888,1890,1893,1896],{"class":657,"line":760},[655,1870,1871],{"class":719},"    { line ",[655,1873,735],{"class":723},[655,1875,1876],{"class":719}," line.",[655,1878,1879],{"class":665},"lowercase",[655,1881,1882],{"class":719},"().",[655,1884,399],{"class":665},[655,1886,1887],{"class":719},"(whitespace).",[655,1889,378],{"class":665},[655,1891,1892],{"class":719}," { it.",[655,1894,1895],{"class":665},"isNotBlank",[655,1897,1898],{"class":719},"() } },\n",[655,1900,1901,1903,1905,1907,1910],{"class":657,"line":765},[655,1902,1224],{"class":719},[655,1904,747],{"class":665},[655,1906,750],{"class":719},[655,1908,1909],{"class":753},"\"split-words\"",[655,1911,1234],{"class":719},[655,1913,1914],{"class":657,"line":771},[655,1915,1239],{"class":719},[646,1917,1919],{"className":805,"code":1918,"filename":807,"language":808,"meta":651,"style":651},"import io.stoatflow.core.topology.Named;\nimport io.stoatflow.core.topology.ValueMapper;\n\nimport java.util.Arrays;\nimport java.util.stream.Collectors;\n\nKStream\u003CString, String> words = lines.flatMapValues(\n    (ValueMapper\u003CString, Iterable\u003CString>>) line ->\n        Arrays.stream(line.toLowerCase().split(\"\\\\s+\"))\n            .filter(w -> !w.isBlank())\n            .collect(Collectors.toList()),\n    Named.as(\"split-words\"));\n",[323,1920,1921,1945,1969,1973,1992,2014,2018,2046,2075,2110,2138,2157],{"__ignoreMap":651},[655,1922,1923,1925,1927,1929,1931,1933,1935,1937,1939,1941,1943],{"class":657,"line":658},[655,1924,662],{"class":661},[655,1926,817],{"class":719},[655,1928,400],{"class":723},[655,1930,822],{"class":719},[655,1932,400],{"class":723},[655,1934,827],{"class":719},[655,1936,400],{"class":723},[655,1938,832],{"class":719},[655,1940,400],{"class":723},[655,1942,452],{"class":719},[655,1944,839],{"class":723},[655,1946,1947,1949,1951,1953,1955,1957,1959,1961,1963,1965,1967],{"class":657,"line":699},[655,1948,662],{"class":661},[655,1950,817],{"class":719},[655,1952,400],{"class":723},[655,1954,822],{"class":719},[655,1956,400],{"class":723},[655,1958,827],{"class":719},[655,1960,400],{"class":723},[655,1962,832],{"class":719},[655,1964,400],{"class":723},[655,1966,862],{"class":719},[655,1968,839],{"class":723},[655,1970,1971],{"class":657,"line":706},[655,1972,703],{"emptyLinePlaceholder":702},[655,1974,1975,1977,1980,1982,1985,1987,1990],{"class":657,"line":713},[655,1976,662],{"class":661},[655,1978,1979],{"class":719}," java",[655,1981,400],{"class":723},[655,1983,1984],{"class":719},"util",[655,1986,400],{"class":723},[655,1988,1989],{"class":719},"Arrays",[655,1991,839],{"class":723},[655,1993,1994,1996,1998,2000,2002,2004,2007,2009,2012],{"class":657,"line":760},[655,1995,662],{"class":661},[655,1997,1979],{"class":719},[655,1999,400],{"class":723},[655,2001,1984],{"class":719},[655,2003,400],{"class":723},[655,2005,2006],{"class":719},"stream",[655,2008,400],{"class":723},[655,2010,2011],{"class":719},"Collectors",[655,2013,839],{"class":723},[655,2015,2016],{"class":657,"line":765},[655,2017,703],{"emptyLinePlaceholder":702},[655,2019,2020,2022,2024,2026,2028,2030,2032,2035,2037,2040,2042,2044],{"class":657,"line":771},[655,2021,333],{"class":719},[655,2023,904],{"class":723},[655,2025,908],{"class":907},[655,2027,911],{"class":723},[655,2029,914],{"class":907},[655,2031,917],{"class":723},[655,2033,2034],{"class":920}," words",[655,2036,1343],{"class":723},[655,2038,2039],{"class":920}," lines",[655,2041,400],{"class":723},[655,2043,384],{"class":665},[655,2045,1177],{"class":723},[655,2047,2048,2050,2052,2054,2056,2058,2061,2063,2065,2067,2069,2072],{"class":657,"line":990},[655,2049,1357],{"class":723},[655,2051,862],{"class":719},[655,2053,904],{"class":907},[655,2055,908],{"class":719},[655,2057,911],{"class":723},[655,2059,2060],{"class":719}," Iterable",[655,2062,904],{"class":907},[655,2064,908],{"class":719},[655,2066,1383],{"class":907},[655,2068,951],{"class":723},[655,2070,2071],{"class":719}," line ",[655,2073,2074],{"class":723},"->\n",[655,2076,2077,2080,2082,2084,2086,2088,2090,2093,2095,2097,2099,2101,2103,2106,2108],{"class":657,"line":995},[655,2078,2079],{"class":920},"        Arrays",[655,2081,400],{"class":723},[655,2083,2006],{"class":665},[655,2085,750],{"class":723},[655,2087,657],{"class":920},[655,2089,400],{"class":723},[655,2091,2092],{"class":665},"toLowerCase",[655,2094,1882],{"class":723},[655,2096,399],{"class":665},[655,2098,750],{"class":723},[655,2100,980],{"class":979},[655,2102,1839],{"class":1838},[655,2104,2105],{"class":753},"s+",[655,2107,980],{"class":979},[655,2109,757],{"class":723},[655,2111,2112,2115,2117,2119,2122,2124,2127,2130,2132,2135],{"class":657,"line":1000},[655,2113,2114],{"class":723},"            .",[655,2116,378],{"class":665},[655,2118,750],{"class":723},[655,2120,2121],{"class":719},"w ",[655,2123,735],{"class":723},[655,2125,2126],{"class":907}," !",[655,2128,2129],{"class":920},"w",[655,2131,400],{"class":723},[655,2133,2134],{"class":665},"isBlank",[655,2136,2137],{"class":723},"())\n",[655,2139,2140,2142,2145,2147,2149,2151,2154],{"class":657,"line":1020},[655,2141,2114],{"class":723},[655,2143,2144],{"class":665},"collect",[655,2146,750],{"class":723},[655,2148,2011],{"class":920},[655,2150,400],{"class":723},[655,2152,2153],{"class":665},"toList",[655,2155,2156],{"class":723},"()),\n",[655,2158,2159,2161,2163,2165,2167,2169,2172,2174],{"class":657,"line":1086},[655,2160,1449],{"class":920},[655,2162,400],{"class":723},[655,2164,636],{"class":665},[655,2166,750],{"class":723},[655,2168,980],{"class":979},[655,2170,2171],{"class":753},"split-words",[655,2173,980],{"class":979},[655,2175,987],{"class":723},[320,2177,2178,2180,2181,2184,2185,2188],{},[323,2179,387],{}," returns an ",[323,2182,2183],{},"Iterable\u003CKeyValue\u003CKR, VR>>"," — each output record carries its own key, so ",[362,2186,2187],{},"this is a key-changing operation"," and each output is re-routed independently.",[682,2190,2191,2275],{"group":684},[646,2192,2194],{"className":648,"code":2193,"filename":688,"language":650,"meta":651,"style":651},"import io.stoatflow.core.state.KeyValue\nimport io.stoatflow.core.topology.Named\n\nval perTag = stream.flatMap(\n    { _, value -> value.tags.map { tag -> KeyValue(tag, value.id) } },\n    Named.`as`(\"explode-tags\"),\n)\n",[323,2195,2196,2202,2208,2212,2227,2258,2271],{"__ignoreMap":651},[655,2197,2198,2200],{"class":657,"line":658},[655,2199,662],{"class":661},[655,2201,1151],{"class":665},[655,2203,2204,2206],{"class":657,"line":699},[655,2205,662],{"class":661},[655,2207,666],{"class":665},[655,2209,2210],{"class":657,"line":706},[655,2211,703],{"emptyLinePlaceholder":702},[655,2213,2214,2216,2219,2221,2223,2225],{"class":657,"line":713},[655,2215,716],{"class":661},[655,2217,2218],{"class":719}," perTag ",[655,2220,724],{"class":723},[655,2222,727],{"class":719},[655,2224,387],{"class":665},[655,2226,1177],{"class":719},[655,2228,2229,2232,2234,2236,2238,2241,2243,2246,2248,2250,2253,2255],{"class":657,"line":760},[655,2230,2231],{"class":719},"    { _, ",[655,2233,1185],{"class":907},[655,2235,1061],{"class":723},[655,2237,1394],{"class":907},[655,2239,2240],{"class":719},".tags.",[655,2242,375],{"class":665},[655,2244,2245],{"class":719}," { tag ",[655,2247,735],{"class":723},[655,2249,1190],{"class":665},[655,2251,2252],{"class":719},"(tag, ",[655,2254,1185],{"class":907},[655,2256,2257],{"class":719},".id) } },\n",[655,2259,2260,2262,2264,2266,2269],{"class":657,"line":765},[655,2261,1224],{"class":719},[655,2263,747],{"class":665},[655,2265,750],{"class":719},[655,2267,2268],{"class":753},"\"explode-tags\"",[655,2270,1234],{"class":719},[655,2272,2273],{"class":657,"line":771},[655,2274,1239],{"class":719},[646,2276,2278],{"className":805,"code":2277,"filename":807,"language":808,"meta":651,"style":651},"import io.stoatflow.core.state.KeyValue;\nimport io.stoatflow.core.topology.KeyValueMapper;\nimport io.stoatflow.core.topology.Named;\n\nimport java.util.stream.Collectors;\n\nKStream\u003CString, String> perTag = stream.flatMap(\n    (KeyValueMapper\u003CString, Doc, Iterable\u003CKeyValue\u003CString, String>>>) (k, value) ->\n        value.tags().stream()\n            .map(tag -> new KeyValue\u003C>(tag, value.id()))\n            .collect(Collectors.toList()),\n    Named.as(\"explode-tags\"));\n",[323,2279,2280,2304,2328,2352,2356,2376,2380,2407,2455,2471,2506,2522],{"__ignoreMap":651},[655,2281,2282,2284,2286,2288,2290,2292,2294,2296,2298,2300,2302],{"class":657,"line":658},[655,2283,662],{"class":661},[655,2285,817],{"class":719},[655,2287,400],{"class":723},[655,2289,822],{"class":719},[655,2291,400],{"class":723},[655,2293,827],{"class":719},[655,2295,400],{"class":723},[655,2297,1263],{"class":719},[655,2299,400],{"class":723},[655,2301,1268],{"class":719},[655,2303,839],{"class":723},[655,2305,2306,2308,2310,2312,2314,2316,2318,2320,2322,2324,2326],{"class":657,"line":699},[655,2307,662],{"class":661},[655,2309,817],{"class":719},[655,2311,400],{"class":723},[655,2313,822],{"class":719},[655,2315,400],{"class":723},[655,2317,827],{"class":719},[655,2319,400],{"class":723},[655,2321,832],{"class":719},[655,2323,400],{"class":723},[655,2325,1293],{"class":719},[655,2327,839],{"class":723},[655,2329,2330,2332,2334,2336,2338,2340,2342,2344,2346,2348,2350],{"class":657,"line":706},[655,2331,662],{"class":661},[655,2333,817],{"class":719},[655,2335,400],{"class":723},[655,2337,822],{"class":719},[655,2339,400],{"class":723},[655,2341,827],{"class":719},[655,2343,400],{"class":723},[655,2345,832],{"class":719},[655,2347,400],{"class":723},[655,2349,452],{"class":719},[655,2351,839],{"class":723},[655,2353,2354],{"class":657,"line":713},[655,2355,703],{"emptyLinePlaceholder":702},[655,2357,2358,2360,2362,2364,2366,2368,2370,2372,2374],{"class":657,"line":760},[655,2359,662],{"class":661},[655,2361,1979],{"class":719},[655,2363,400],{"class":723},[655,2365,1984],{"class":719},[655,2367,400],{"class":723},[655,2369,2006],{"class":719},[655,2371,400],{"class":723},[655,2373,2011],{"class":719},[655,2375,839],{"class":723},[655,2377,2378],{"class":657,"line":765},[655,2379,703],{"emptyLinePlaceholder":702},[655,2381,2382,2384,2386,2388,2390,2392,2394,2397,2399,2401,2403,2405],{"class":657,"line":771},[655,2383,333],{"class":719},[655,2385,904],{"class":723},[655,2387,908],{"class":907},[655,2389,911],{"class":723},[655,2391,914],{"class":907},[655,2393,917],{"class":723},[655,2395,2396],{"class":920}," perTag",[655,2398,1343],{"class":723},[655,2400,1346],{"class":920},[655,2402,400],{"class":723},[655,2404,387],{"class":665},[655,2406,1177],{"class":723},[655,2408,2409,2411,2413,2415,2417,2419,2422,2424,2426,2428,2430,2432,2434,2436,2438,2441,2443,2445,2447,2449,2451,2453],{"class":657,"line":990},[655,2410,1357],{"class":723},[655,2412,1293],{"class":719},[655,2414,904],{"class":907},[655,2416,908],{"class":719},[655,2418,911],{"class":723},[655,2420,2421],{"class":719}," Doc",[655,2423,911],{"class":723},[655,2425,2060],{"class":719},[655,2427,904],{"class":907},[655,2429,1268],{"class":719},[655,2431,904],{"class":907},[655,2433,908],{"class":719},[655,2435,911],{"class":723},[655,2437,914],{"class":719},[655,2439,2440],{"class":907},">>>",[655,2442,951],{"class":723},[655,2444,1049],{"class":723},[655,2446,1052],{"class":719},[655,2448,911],{"class":723},[655,2450,1394],{"class":719},[655,2452,951],{"class":723},[655,2454,1399],{"class":723},[655,2456,2457,2460,2462,2465,2467,2469],{"class":657,"line":995},[655,2458,2459],{"class":920},"        value",[655,2461,400],{"class":723},[655,2463,2464],{"class":665},"tags",[655,2466,1882],{"class":723},[655,2468,2006],{"class":665},[655,2470,1850],{"class":723},[655,2472,2473,2475,2477,2479,2482,2484,2487,2489,2491,2494,2496,2498,2500,2503],{"class":657,"line":1000},[655,2474,2114],{"class":723},[655,2476,375],{"class":665},[655,2478,750],{"class":723},[655,2480,2481],{"class":719},"tag ",[655,2483,735],{"class":723},[655,2485,2486],{"class":661}," new",[655,2488,1190],{"class":719},[655,2490,1409],{"class":723},[655,2492,2493],{"class":719},"tag",[655,2495,911],{"class":723},[655,2497,1394],{"class":920},[655,2499,400],{"class":723},[655,2501,2502],{"class":665},"id",[655,2504,2505],{"class":723},"()))\n",[655,2507,2508,2510,2512,2514,2516,2518,2520],{"class":657,"line":1020},[655,2509,2114],{"class":723},[655,2511,2144],{"class":665},[655,2513,750],{"class":723},[655,2515,2011],{"class":920},[655,2517,400],{"class":723},[655,2519,2153],{"class":665},[655,2521,2156],{"class":723},[655,2523,2524,2526,2528,2530,2532,2534,2537,2539],{"class":657,"line":1086},[655,2525,1449],{"class":920},[655,2527,400],{"class":723},[655,2529,636],{"class":665},[655,2531,750],{"class":723},[655,2533,980],{"class":979},[655,2535,2536],{"class":753},"explode-tags",[655,2538,980],{"class":979},[655,2540,987],{"class":723},[455,2542,2544,2545],{"id":2543},"re-keying-selectkey","Re-keying — ",[323,2546,390],{},[320,2548,2549,2551,2552,2555,2556,2559],{},[323,2550,390],{}," replaces only the key, leaving the value alone. ",[362,2553,2554],{},"It is a key-changing operation"," — use it before ",[323,2557,2558],{},"groupByKey"," or a join when you need to key the stream on a value field.",[682,2561,2562,2608],{"group":684},[646,2563,2565],{"className":648,"code":2564,"filename":688,"language":650,"meta":651,"style":651},"import io.stoatflow.core.topology.Named\n\nval byCustomer = orders.selectKey({ _, order -> order.customerId }, Named.`as`(\"key-by-customer\"))\n",[323,2566,2567,2573,2577],{"__ignoreMap":651},[655,2568,2569,2571],{"class":657,"line":658},[655,2570,662],{"class":661},[655,2572,666],{"class":665},[655,2574,2575],{"class":657,"line":699},[655,2576,703],{"emptyLinePlaceholder":702},[655,2578,2579,2581,2584,2586,2589,2591,2594,2596,2599,2601,2603,2606],{"class":657,"line":706},[655,2580,716],{"class":661},[655,2582,2583],{"class":719}," byCustomer ",[655,2585,724],{"class":723},[655,2587,2588],{"class":719}," orders.",[655,2590,390],{"class":665},[655,2592,2593],{"class":719},"({ _, order ",[655,2595,735],{"class":723},[655,2597,2598],{"class":719}," order.customerId }, Named.",[655,2600,747],{"class":665},[655,2602,750],{"class":719},[655,2604,2605],{"class":753},"\"key-by-customer\"",[655,2607,757],{"class":719},[646,2609,2611],{"className":805,"code":2610,"filename":807,"language":808,"meta":651,"style":651},"import io.stoatflow.core.topology.KeyValueMapper;\nimport io.stoatflow.core.topology.Named;\n\nKStream\u003CString, Order> byCustomer =\n    orders.selectKey((KeyValueMapper\u003CString, Order, String>) (k, order) -> order.customerId(),\n        Named.as(\"key-by-customer\"));\n",[323,2612,2613,2637,2661,2665,2685,2737],{"__ignoreMap":651},[655,2614,2615,2617,2619,2621,2623,2625,2627,2629,2631,2633,2635],{"class":657,"line":658},[655,2616,662],{"class":661},[655,2618,817],{"class":719},[655,2620,400],{"class":723},[655,2622,822],{"class":719},[655,2624,400],{"class":723},[655,2626,827],{"class":719},[655,2628,400],{"class":723},[655,2630,832],{"class":719},[655,2632,400],{"class":723},[655,2634,1293],{"class":719},[655,2636,839],{"class":723},[655,2638,2639,2641,2643,2645,2647,2649,2651,2653,2655,2657,2659],{"class":657,"line":699},[655,2640,662],{"class":661},[655,2642,817],{"class":719},[655,2644,400],{"class":723},[655,2646,822],{"class":719},[655,2648,400],{"class":723},[655,2650,827],{"class":719},[655,2652,400],{"class":723},[655,2654,832],{"class":719},[655,2656,400],{"class":723},[655,2658,452],{"class":719},[655,2660,839],{"class":723},[655,2662,2663],{"class":657,"line":706},[655,2664,703],{"emptyLinePlaceholder":702},[655,2666,2667,2669,2671,2673,2675,2678,2680,2683],{"class":657,"line":713},[655,2668,333],{"class":719},[655,2670,904],{"class":723},[655,2672,908],{"class":907},[655,2674,911],{"class":723},[655,2676,2677],{"class":907}," Order",[655,2679,917],{"class":723},[655,2681,2682],{"class":920}," byCustomer",[655,2684,924],{"class":723},[655,2686,2687,2690,2692,2694,2696,2698,2700,2702,2704,2706,2708,2710,2712,2714,2716,2718,2720,2723,2725,2727,2729,2731,2734],{"class":657,"line":760},[655,2688,2689],{"class":920},"    orders",[655,2691,400],{"class":723},[655,2693,390],{"class":665},[655,2695,936],{"class":723},[655,2697,1293],{"class":719},[655,2699,904],{"class":907},[655,2701,908],{"class":719},[655,2703,911],{"class":723},[655,2705,2677],{"class":719},[655,2707,911],{"class":723},[655,2709,914],{"class":719},[655,2711,917],{"class":907},[655,2713,951],{"class":723},[655,2715,1049],{"class":723},[655,2717,1052],{"class":719},[655,2719,911],{"class":723},[655,2721,2722],{"class":719}," order",[655,2724,951],{"class":723},[655,2726,1061],{"class":723},[655,2728,2722],{"class":920},[655,2730,400],{"class":723},[655,2732,2733],{"class":665},"customerId",[655,2735,2736],{"class":723},"(),\n",[655,2738,2739,2741,2743,2745,2747,2749,2752,2754],{"class":657,"line":765},[655,2740,1089],{"class":920},[655,2742,400],{"class":723},[655,2744,636],{"class":665},[655,2746,750],{"class":723},[655,2748,980],{"class":979},[655,2750,2751],{"class":753},"key-by-customer",[655,2753,980],{"class":979},[655,2755,987],{"class":723},[455,2757,2759,2760],{"id":2758},"side-effects-peek","Side effects — ",[323,2761,393],{},[320,2763,2764,2766,2767,2770],{},[323,2765,393],{}," runs an action for each record (logging, counters, debugging) and forwards the record unchanged. The key is never modified. (",[323,2768,2769],{},"forEach"," is the terminal variant — it runs the action but returns nothing, ending the chain.)",[682,2772,2773,2825],{"group":684},[646,2774,2776],{"className":648,"code":2775,"filename":688,"language":650,"meta":651,"style":651},"import io.stoatflow.core.topology.Named\n\nval observed = stream.peek({ k, v -> println(\"$k => $v\") }, Named.`as`(\"log\"))\n",[323,2777,2778,2784,2788],{"__ignoreMap":651},[655,2779,2780,2782],{"class":657,"line":658},[655,2781,662],{"class":661},[655,2783,666],{"class":665},[655,2785,2786],{"class":657,"line":699},[655,2787,703],{"emptyLinePlaceholder":702},[655,2789,2790,2792,2795,2797,2799,2801,2803,2805,2808,2810,2813,2816,2818,2820,2823],{"class":657,"line":706},[655,2791,716],{"class":661},[655,2793,2794],{"class":719}," observed ",[655,2796,724],{"class":723},[655,2798,727],{"class":719},[655,2800,393],{"class":665},[655,2802,785],{"class":719},[655,2804,735],{"class":723},[655,2806,2807],{"class":665}," println",[655,2809,750],{"class":719},[655,2811,2812],{"class":753},"\"$k => $v\"",[655,2814,2815],{"class":719},") }, Named.",[655,2817,747],{"class":665},[655,2819,750],{"class":719},[655,2821,2822],{"class":753},"\"log\"",[655,2824,757],{"class":719},[646,2826,2828],{"className":805,"code":2827,"filename":807,"language":808,"meta":651,"style":651},"import io.stoatflow.core.topology.ForeachAction;\nimport io.stoatflow.core.topology.Named;\n\nKStream\u003CLong, String> observed =\n    stream.peek((ForeachAction\u003CLong, String>) (k, v) -> System.out.println(k + \" => \" + v),\n        Named.as(\"log\"));\n",[323,2829,2830,2855,2879,2883,2902,2971],{"__ignoreMap":651},[655,2831,2832,2834,2836,2838,2840,2842,2844,2846,2848,2850,2853],{"class":657,"line":658},[655,2833,662],{"class":661},[655,2835,817],{"class":719},[655,2837,400],{"class":723},[655,2839,822],{"class":719},[655,2841,400],{"class":723},[655,2843,827],{"class":719},[655,2845,400],{"class":723},[655,2847,832],{"class":719},[655,2849,400],{"class":723},[655,2851,2852],{"class":719},"ForeachAction",[655,2854,839],{"class":723},[655,2856,2857,2859,2861,2863,2865,2867,2869,2871,2873,2875,2877],{"class":657,"line":699},[655,2858,662],{"class":661},[655,2860,817],{"class":719},[655,2862,400],{"class":723},[655,2864,822],{"class":719},[655,2866,400],{"class":723},[655,2868,827],{"class":719},[655,2870,400],{"class":723},[655,2872,832],{"class":719},[655,2874,400],{"class":723},[655,2876,452],{"class":719},[655,2878,839],{"class":723},[655,2880,2881],{"class":657,"line":706},[655,2882,703],{"emptyLinePlaceholder":702},[655,2884,2885,2887,2889,2891,2893,2895,2897,2900],{"class":657,"line":713},[655,2886,333],{"class":719},[655,2888,904],{"class":723},[655,2890,1364],{"class":907},[655,2892,911],{"class":723},[655,2894,914],{"class":907},[655,2896,917],{"class":723},[655,2898,2899],{"class":920}," observed",[655,2901,924],{"class":723},[655,2903,2904,2906,2908,2910,2912,2914,2916,2918,2920,2922,2924,2926,2928,2930,2932,2934,2936,2938,2941,2943,2946,2948,2951,2953,2956,2958,2960,2963,2965,2967,2969],{"class":657,"line":760},[655,2905,929],{"class":920},[655,2907,400],{"class":723},[655,2909,393],{"class":665},[655,2911,936],{"class":723},[655,2913,2852],{"class":719},[655,2915,904],{"class":907},[655,2917,1364],{"class":719},[655,2919,911],{"class":723},[655,2921,914],{"class":719},[655,2923,917],{"class":907},[655,2925,951],{"class":723},[655,2927,1049],{"class":723},[655,2929,1052],{"class":719},[655,2931,911],{"class":723},[655,2933,959],{"class":719},[655,2935,951],{"class":723},[655,2937,1061],{"class":723},[655,2939,2940],{"class":920}," System",[655,2942,400],{"class":723},[655,2944,2945],{"class":920},"out",[655,2947,400],{"class":723},[655,2949,2950],{"class":665},"println",[655,2952,750],{"class":723},[655,2954,2955],{"class":719},"k ",[655,2957,1067],{"class":907},[655,2959,1070],{"class":979},[655,2961,2962],{"class":753}," => ",[655,2964,980],{"class":979},[655,2966,1078],{"class":907},[655,2968,959],{"class":719},[655,2970,1234],{"class":723},[655,2972,2973,2975,2977,2979,2981,2983,2986,2988],{"class":657,"line":765},[655,2974,1089],{"class":920},[655,2976,400],{"class":723},[655,2978,636],{"class":665},[655,2980,750],{"class":723},[655,2982,980],{"class":979},[655,2984,2985],{"class":753},"log",[655,2987,980],{"class":979},[655,2989,987],{"class":723},[320,2991,2992,2993,2995,2996,400],{},"The Java overloads take a ",[323,2994,2852],{},", so void lambdas work directly — no ",[323,2997,2998],{},"return Unit.INSTANCE",[455,3000,3002,3003],{"id":3001},"combining-streams-merge","Combining streams — ",[323,3004,396],{},[320,3006,3007,3009,3010,3013,3014,400],{},[323,3008,396],{}," combines two streams of the same key\u002Fvalue types into one. It is ",[362,3011,3012],{},"not"," a key-changing operation: records keep their original key affinity. Both streams must come from the same ",[323,3015,347],{},[682,3017,3018,3059],{"group":684},[646,3019,3021],{"className":648,"code":3020,"filename":688,"language":650,"meta":651,"style":651},"import io.stoatflow.core.topology.Named\n\nval combined = streamA.merge(streamB, Named.`as`(\"merge-a-b\"))\n",[323,3022,3023,3029,3033],{"__ignoreMap":651},[655,3024,3025,3027],{"class":657,"line":658},[655,3026,662],{"class":661},[655,3028,666],{"class":665},[655,3030,3031],{"class":657,"line":699},[655,3032,703],{"emptyLinePlaceholder":702},[655,3034,3035,3037,3040,3042,3045,3047,3050,3052,3054,3057],{"class":657,"line":706},[655,3036,716],{"class":661},[655,3038,3039],{"class":719}," combined ",[655,3041,724],{"class":723},[655,3043,3044],{"class":719}," streamA.",[655,3046,396],{"class":665},[655,3048,3049],{"class":719},"(streamB, Named.",[655,3051,747],{"class":665},[655,3053,750],{"class":719},[655,3055,3056],{"class":753},"\"merge-a-b\"",[655,3058,757],{"class":719},[646,3060,3062],{"className":805,"code":3061,"filename":807,"language":808,"meta":651,"style":651},"import io.stoatflow.core.topology.Named;\n\nKStream\u003CString, String> combined = streamA.merge(streamB, Named.as(\"merge-a-b\"));\n",[323,3063,3064,3088,3092],{"__ignoreMap":651},[655,3065,3066,3068,3070,3072,3074,3076,3078,3080,3082,3084,3086],{"class":657,"line":658},[655,3067,662],{"class":661},[655,3069,817],{"class":719},[655,3071,400],{"class":723},[655,3073,822],{"class":719},[655,3075,400],{"class":723},[655,3077,827],{"class":719},[655,3079,400],{"class":723},[655,3081,832],{"class":719},[655,3083,400],{"class":723},[655,3085,452],{"class":719},[655,3087,839],{"class":723},[655,3089,3090],{"class":657,"line":699},[655,3091,703],{"emptyLinePlaceholder":702},[655,3093,3094,3096,3098,3100,3102,3104,3106,3109,3111,3114,3116,3118,3120,3123,3125,3127,3129,3131,3133,3135,3138,3140],{"class":657,"line":706},[655,3095,333],{"class":719},[655,3097,904],{"class":723},[655,3099,908],{"class":907},[655,3101,911],{"class":723},[655,3103,914],{"class":907},[655,3105,917],{"class":723},[655,3107,3108],{"class":920}," combined",[655,3110,1343],{"class":723},[655,3112,3113],{"class":920}," streamA",[655,3115,400],{"class":723},[655,3117,396],{"class":665},[655,3119,750],{"class":723},[655,3121,3122],{"class":719},"streamB",[655,3124,911],{"class":723},[655,3126,970],{"class":920},[655,3128,400],{"class":723},[655,3130,636],{"class":665},[655,3132,750],{"class":723},[655,3134,980],{"class":979},[655,3136,3137],{"class":753},"merge-a-b",[655,3139,980],{"class":979},[655,3141,987],{"class":723},[455,3143,3145,3146],{"id":3144},"branching-split","Branching — ",[323,3147,399],{},[320,3149,3150,3152,3153,3156,3157,1129,3160,3163,3164,513,3167,3170,3171,3173,3174,3177,3178,3181,3182,3185,3186,3189,3190,3192],{},[323,3151,399],{}," routes each record to ",[362,3154,3155],{},"exactly one"," branch using first-match semantics: predicates are evaluated in order, and the first match wins. ",[323,3158,3159],{},"split()",[323,3161,3162],{},"BranchedKStream","; the terminal ",[323,3165,3166],{},"defaultBranch()",[323,3168,3169],{},"noDefaultBranch()"," call returns a map of branch name to ",[323,3172,333],{},". Branch names are the split name plus the ",[323,3175,3176],{},"Branched"," suffix — e.g. split name ",[323,3179,3180],{},"router"," plus suffix ",[323,3183,3184],{},"-high"," gives key ",[323,3187,3188],{},"router-high",". ",[323,3191,399],{}," does not change the key.",[320,3194,3195,3196,3198,3199,3202,3203,3205],{},"Finish the chain with ",[323,3197,3166],{}," (unmatched records go to a default branch), ",[323,3200,3201],{},"defaultBranch(Branched.as(\"-suffix\"))"," (named default), or ",[323,3204,3169],{}," (unmatched records are dropped).",[682,3207,3208,3435],{"group":684},[646,3209,3211],{"className":648,"code":3210,"filename":688,"language":650,"meta":651,"style":651},"import io.stoatflow.core.topology.Branched\nimport io.stoatflow.core.topology.Named\n\nval branches: Map\u003CString, KStream\u003CLong, String>> = stream\n    .split(Named.`as`(\"router\"))\n    .branch({ _, v -> v.length > 20 }, Branched.`as`(\"-high\"))\n    .branch({ _, v -> v.length > 10 }, Branched.`as`(\"-medium\"))\n    .defaultBranch(Branched.`as`(\"-low\"))\n\nbranches[\"router-high\"]!!.to(\"high-topic\")\nbranches[\"router-medium\"]!!.to(\"medium-topic\")\nbranches[\"router-low\"]!!.to(\"low-topic\")\n",[323,3212,3213,3220,3226,3230,3265,3284,3314,3342,3361,3365,3391,3413],{"__ignoreMap":651},[655,3214,3215,3217],{"class":657,"line":658},[655,3216,662],{"class":661},[655,3218,3219],{"class":665}," io.stoatflow.core.topology.Branched\n",[655,3221,3222,3224],{"class":657,"line":699},[655,3223,662],{"class":661},[655,3225,666],{"class":665},[655,3227,3228],{"class":657,"line":706},[655,3229,703],{"emptyLinePlaceholder":702},[655,3231,3232,3234,3237,3241,3243,3245,3247,3249,3251,3253,3255,3257,3260,3262],{"class":657,"line":713},[655,3233,716],{"class":661},[655,3235,3236],{"class":719}," branches: ",[655,3238,3240],{"class":3239},"sUxyF","Map",[655,3242,904],{"class":719},[655,3244,908],{"class":3239},[655,3246,372],{"class":719},[655,3248,333],{"class":3239},[655,3250,904],{"class":719},[655,3252,1364],{"class":3239},[655,3254,372],{"class":719},[655,3256,908],{"class":3239},[655,3258,3259],{"class":719},">> ",[655,3261,724],{"class":723},[655,3263,3264],{"class":719}," stream\n",[655,3266,3267,3270,3272,3275,3277,3279,3282],{"class":657,"line":760},[655,3268,3269],{"class":719},"    .",[655,3271,399],{"class":665},[655,3273,3274],{"class":719},"(Named.",[655,3276,747],{"class":665},[655,3278,750],{"class":719},[655,3280,3281],{"class":753},"\"router\"",[655,3283,757],{"class":719},[655,3285,3286,3288,3291,3293,3295,3297,3299,3302,3305,3307,3309,3312],{"class":657,"line":765},[655,3287,3269],{"class":719},[655,3289,3290],{"class":665},"branch",[655,3292,1513],{"class":719},[655,3294,735],{"class":723},[655,3296,1518],{"class":719},[655,3298,917],{"class":907},[655,3300,3301],{"class":1204}," 20",[655,3303,3304],{"class":719}," }, Branched.",[655,3306,747],{"class":665},[655,3308,750],{"class":719},[655,3310,3311],{"class":753},"\"-high\"",[655,3313,757],{"class":719},[655,3315,3316,3318,3320,3322,3324,3326,3328,3331,3333,3335,3337,3340],{"class":657,"line":771},[655,3317,3269],{"class":719},[655,3319,3290],{"class":665},[655,3321,1513],{"class":719},[655,3323,735],{"class":723},[655,3325,1518],{"class":719},[655,3327,917],{"class":907},[655,3329,3330],{"class":1204}," 10",[655,3332,3304],{"class":719},[655,3334,747],{"class":665},[655,3336,750],{"class":719},[655,3338,3339],{"class":753},"\"-medium\"",[655,3341,757],{"class":719},[655,3343,3344,3346,3349,3352,3354,3356,3359],{"class":657,"line":990},[655,3345,3269],{"class":719},[655,3347,3348],{"class":665},"defaultBranch",[655,3350,3351],{"class":719},"(Branched.",[655,3353,747],{"class":665},[655,3355,750],{"class":719},[655,3357,3358],{"class":753},"\"-low\"",[655,3360,757],{"class":719},[655,3362,3363],{"class":657,"line":995},[655,3364,703],{"emptyLinePlaceholder":702},[655,3366,3367,3370,3373,3376,3379,3381,3384,3386,3389],{"class":657,"line":1000},[655,3368,3369],{"class":719},"branches[",[655,3371,3372],{"class":753},"\"router-high\"",[655,3374,3375],{"class":719},"]",[655,3377,3378],{"class":907},"!!",[655,3380,400],{"class":719},[655,3382,3383],{"class":665},"to",[655,3385,750],{"class":719},[655,3387,3388],{"class":753},"\"high-topic\"",[655,3390,1239],{"class":719},[655,3392,3393,3395,3398,3400,3402,3404,3406,3408,3411],{"class":657,"line":1020},[655,3394,3369],{"class":719},[655,3396,3397],{"class":753},"\"router-medium\"",[655,3399,3375],{"class":719},[655,3401,3378],{"class":907},[655,3403,400],{"class":719},[655,3405,3383],{"class":665},[655,3407,750],{"class":719},[655,3409,3410],{"class":753},"\"medium-topic\"",[655,3412,1239],{"class":719},[655,3414,3415,3417,3420,3422,3424,3426,3428,3430,3433],{"class":657,"line":1086},[655,3416,3369],{"class":719},[655,3418,3419],{"class":753},"\"router-low\"",[655,3421,3375],{"class":719},[655,3423,3378],{"class":907},[655,3425,400],{"class":719},[655,3427,3383],{"class":665},[655,3429,750],{"class":719},[655,3431,3432],{"class":753},"\"low-topic\"",[655,3434,1239],{"class":719},[646,3436,3438],{"className":805,"code":3437,"filename":807,"language":808,"meta":651,"style":651},"import io.stoatflow.core.topology.Branched;\nimport io.stoatflow.core.topology.Named;\nimport io.stoatflow.core.topology.Predicate;\n\nimport java.util.Map;\n\nMap\u003CString, KStream\u003CLong, String>> branches = stream\n    .split(Named.as(\"router\"))\n    .branch((Predicate\u003CLong, String>) (k, v) -> v.length() > 20, Branched.as(\"-high\"))\n    .branch((Predicate\u003CLong, String>) (k, v) -> v.length() > 10, Branched.as(\"-medium\"))\n    .defaultBranch(Branched.as(\"-low\"));\n\nbranches.get(\"router-high\").to(\"high-topic\");\nbranches.get(\"router-medium\").to(\"medium-topic\");\nbranches.get(\"router-low\").to(\"low-topic\");\n",[323,3439,3440,3464,3488,3512,3516,3532,3536,3566,3590,3655,3720,3745,3749,3784,3817],{"__ignoreMap":651},[655,3441,3442,3444,3446,3448,3450,3452,3454,3456,3458,3460,3462],{"class":657,"line":658},[655,3443,662],{"class":661},[655,3445,817],{"class":719},[655,3447,400],{"class":723},[655,3449,822],{"class":719},[655,3451,400],{"class":723},[655,3453,827],{"class":719},[655,3455,400],{"class":723},[655,3457,832],{"class":719},[655,3459,400],{"class":723},[655,3461,3176],{"class":719},[655,3463,839],{"class":723},[655,3465,3466,3468,3470,3472,3474,3476,3478,3480,3482,3484,3486],{"class":657,"line":699},[655,3467,662],{"class":661},[655,3469,817],{"class":719},[655,3471,400],{"class":723},[655,3473,822],{"class":719},[655,3475,400],{"class":723},[655,3477,827],{"class":719},[655,3479,400],{"class":723},[655,3481,832],{"class":719},[655,3483,400],{"class":723},[655,3485,452],{"class":719},[655,3487,839],{"class":723},[655,3489,3490,3492,3494,3496,3498,3500,3502,3504,3506,3508,3510],{"class":657,"line":706},[655,3491,662],{"class":661},[655,3493,817],{"class":719},[655,3495,400],{"class":723},[655,3497,822],{"class":719},[655,3499,400],{"class":723},[655,3501,827],{"class":719},[655,3503,400],{"class":723},[655,3505,832],{"class":719},[655,3507,400],{"class":723},[655,3509,1619],{"class":719},[655,3511,839],{"class":723},[655,3513,3514],{"class":657,"line":713},[655,3515,703],{"emptyLinePlaceholder":702},[655,3517,3518,3520,3522,3524,3526,3528,3530],{"class":657,"line":760},[655,3519,662],{"class":661},[655,3521,1979],{"class":719},[655,3523,400],{"class":723},[655,3525,1984],{"class":719},[655,3527,400],{"class":723},[655,3529,3240],{"class":719},[655,3531,839],{"class":723},[655,3533,3534],{"class":657,"line":765},[655,3535,703],{"emptyLinePlaceholder":702},[655,3537,3538,3540,3542,3544,3546,3549,3551,3553,3555,3557,3559,3562,3564],{"class":657,"line":771},[655,3539,3240],{"class":719},[655,3541,904],{"class":723},[655,3543,908],{"class":907},[655,3545,911],{"class":723},[655,3547,3548],{"class":719}," KStream",[655,3550,904],{"class":723},[655,3552,1364],{"class":907},[655,3554,911],{"class":723},[655,3556,914],{"class":907},[655,3558,1383],{"class":723},[655,3560,3561],{"class":920}," branches",[655,3563,1343],{"class":723},[655,3565,3264],{"class":719},[655,3567,3568,3570,3572,3574,3576,3578,3580,3582,3584,3586,3588],{"class":657,"line":990},[655,3569,3269],{"class":723},[655,3571,399],{"class":665},[655,3573,750],{"class":723},[655,3575,452],{"class":920},[655,3577,400],{"class":723},[655,3579,636],{"class":665},[655,3581,750],{"class":723},[655,3583,980],{"class":979},[655,3585,3180],{"class":753},[655,3587,980],{"class":979},[655,3589,757],{"class":723},[655,3591,3592,3594,3596,3598,3600,3602,3604,3606,3608,3610,3612,3614,3616,3618,3620,3622,3624,3626,3628,3630,3632,3634,3636,3638,3641,3643,3645,3647,3649,3651,3653],{"class":657,"line":995},[655,3593,3269],{"class":723},[655,3595,3290],{"class":665},[655,3597,936],{"class":723},[655,3599,1619],{"class":719},[655,3601,904],{"class":907},[655,3603,1364],{"class":719},[655,3605,911],{"class":723},[655,3607,914],{"class":719},[655,3609,917],{"class":907},[655,3611,951],{"class":723},[655,3613,1049],{"class":723},[655,3615,1052],{"class":719},[655,3617,911],{"class":723},[655,3619,959],{"class":719},[655,3621,951],{"class":723},[655,3623,1061],{"class":723},[655,3625,959],{"class":920},[655,3627,400],{"class":723},[655,3629,1687],{"class":665},[655,3631,1690],{"class":723},[655,3633,1693],{"class":907},[655,3635,3301],{"class":1204},[655,3637,911],{"class":723},[655,3639,3640],{"class":920}," Branched",[655,3642,400],{"class":723},[655,3644,636],{"class":665},[655,3646,750],{"class":723},[655,3648,980],{"class":979},[655,3650,3184],{"class":753},[655,3652,980],{"class":979},[655,3654,757],{"class":723},[655,3656,3657,3659,3661,3663,3665,3667,3669,3671,3673,3675,3677,3679,3681,3683,3685,3687,3689,3691,3693,3695,3697,3699,3701,3703,3705,3707,3709,3711,3713,3716,3718],{"class":657,"line":1000},[655,3658,3269],{"class":723},[655,3660,3290],{"class":665},[655,3662,936],{"class":723},[655,3664,1619],{"class":719},[655,3666,904],{"class":907},[655,3668,1364],{"class":719},[655,3670,911],{"class":723},[655,3672,914],{"class":719},[655,3674,917],{"class":907},[655,3676,951],{"class":723},[655,3678,1049],{"class":723},[655,3680,1052],{"class":719},[655,3682,911],{"class":723},[655,3684,959],{"class":719},[655,3686,951],{"class":723},[655,3688,1061],{"class":723},[655,3690,959],{"class":920},[655,3692,400],{"class":723},[655,3694,1687],{"class":665},[655,3696,1690],{"class":723},[655,3698,1693],{"class":907},[655,3700,3330],{"class":1204},[655,3702,911],{"class":723},[655,3704,3640],{"class":920},[655,3706,400],{"class":723},[655,3708,636],{"class":665},[655,3710,750],{"class":723},[655,3712,980],{"class":979},[655,3714,3715],{"class":753},"-medium",[655,3717,980],{"class":979},[655,3719,757],{"class":723},[655,3721,3722,3724,3726,3728,3730,3732,3734,3736,3738,3741,3743],{"class":657,"line":1020},[655,3723,3269],{"class":723},[655,3725,3348],{"class":665},[655,3727,750],{"class":723},[655,3729,3176],{"class":920},[655,3731,400],{"class":723},[655,3733,636],{"class":665},[655,3735,750],{"class":723},[655,3737,980],{"class":979},[655,3739,3740],{"class":753},"-low",[655,3742,980],{"class":979},[655,3744,987],{"class":723},[655,3746,3747],{"class":657,"line":1086},[655,3748,703],{"emptyLinePlaceholder":702},[655,3750,3752,3755,3757,3760,3762,3764,3766,3768,3770,3772,3774,3776,3779,3781],{"class":657,"line":3751},13,[655,3753,3754],{"class":920},"branches",[655,3756,400],{"class":723},[655,3758,3759],{"class":665},"get",[655,3761,750],{"class":723},[655,3763,980],{"class":979},[655,3765,3188],{"class":753},[655,3767,980],{"class":979},[655,3769,351],{"class":723},[655,3771,3383],{"class":665},[655,3773,750],{"class":723},[655,3775,980],{"class":979},[655,3777,3778],{"class":753},"high-topic",[655,3780,980],{"class":979},[655,3782,3783],{"class":723},");\n",[655,3785,3787,3789,3791,3793,3795,3797,3800,3802,3804,3806,3808,3810,3813,3815],{"class":657,"line":3786},14,[655,3788,3754],{"class":920},[655,3790,400],{"class":723},[655,3792,3759],{"class":665},[655,3794,750],{"class":723},[655,3796,980],{"class":979},[655,3798,3799],{"class":753},"router-medium",[655,3801,980],{"class":979},[655,3803,351],{"class":723},[655,3805,3383],{"class":665},[655,3807,750],{"class":723},[655,3809,980],{"class":979},[655,3811,3812],{"class":753},"medium-topic",[655,3814,980],{"class":979},[655,3816,3783],{"class":723},[655,3818,3820,3822,3824,3826,3828,3830,3833,3835,3837,3839,3841,3843,3846,3848],{"class":657,"line":3819},15,[655,3821,3754],{"class":920},[655,3823,400],{"class":723},[655,3825,3759],{"class":665},[655,3827,750],{"class":723},[655,3829,980],{"class":979},[655,3831,3832],{"class":753},"router-low",[655,3834,980],{"class":979},[655,3836,351],{"class":723},[655,3838,3383],{"class":665},[655,3840,750],{"class":723},[655,3842,980],{"class":979},[655,3844,3845],{"class":753},"low-topic",[655,3847,980],{"class":979},[655,3849,3783],{"class":723},[320,3851,3852,3854,3855,3858,3859,3862],{},[323,3853,3176],{}," can also inline a branch transform or side effect instead of returning the stream in the map: ",[323,3856,3857],{},"Branched.withFunction(s -> s.mapValues(...), \"-medium\")"," applies a transform and stores the result; ",[323,3860,3861],{},"Branched.withConsumer(s -> s.to(\"topic\"), \"-low\")"," applies a side effect and stores the original branch stream.",[455,3864,3866],{"id":3865},"ktable-basics","KTable basics",[320,3868,3869,3870,3872,3873,3876,3877,3879],{},"A ",[323,3871,337],{}," represents the latest value per key as a changelog. You get one from ",[323,3874,3875],{},"StreamsBuilder.table(...)",", from a stream-to-table conversion (",[323,3878,420],{},"), or as the output of an aggregation. The stateless KTable operators mirror the stream ones but operate on the table's changelog.",[3881,3882,3884,468,3886],"h3",{"id":3883},"mapvalues-and-filter",[323,3885,371],{},[323,3887,378],{},[320,3889,3890,3893,3894,513,3897,3899,3900,3903],{},[323,3891,3892],{},"KTable.mapValues"," transforms values (value-only and key-aware forms). ",[323,3895,3896],{},"KTable.filter",[323,3898,381],{}," keep or drop entries by predicate. Without a ",[323,3901,3902],{},"Materialized"," argument these are derived, on-the-fly views over the source table's state and keep no store of their own.",[1106,3905,3908],{"color":3906,"icon":3907},"info","i-lucide-info",[320,3909,3910,3911,3913,3914,3917,3918,3920,3921,400],{},"A materialized ",[323,3912,3896],{}," differs semantically from the non-materialized form: when an entry stops matching, a materialized filter writes a ",[362,3915,3916],{},"tombstone"," (null) to its store and forwards it downstream, whereas the non-materialized filter simply doesn't forward the record. Pass a ",[323,3919,3902],{}," argument to opt into the store. See ",[343,3922,100],{"href":101},[682,3924,3925,4002],{"group":684},[646,3926,3928],{"className":648,"code":3927,"filename":688,"language":650,"meta":651,"style":651},"import io.stoatflow.core.topology.Named\n\nval upper = table\n    .mapValues({ v -> v.uppercase() }, Named.`as`(\"table-upper\"))\n    .filter({ _, v -> v.isNotEmpty() }, Named.`as`(\"table-non-empty\"))\n",[323,3929,3930,3936,3940,3951,3976],{"__ignoreMap":651},[655,3931,3932,3934],{"class":657,"line":658},[655,3933,662],{"class":661},[655,3935,666],{"class":665},[655,3937,3938],{"class":657,"line":699},[655,3939,703],{"emptyLinePlaceholder":702},[655,3941,3942,3944,3946,3948],{"class":657,"line":706},[655,3943,716],{"class":661},[655,3945,720],{"class":719},[655,3947,724],{"class":723},[655,3949,3950],{"class":719}," table\n",[655,3952,3953,3955,3957,3959,3961,3963,3965,3967,3969,3971,3974],{"class":657,"line":713},[655,3954,3269],{"class":719},[655,3956,371],{"class":665},[655,3958,732],{"class":719},[655,3960,735],{"class":723},[655,3962,738],{"class":719},[655,3964,741],{"class":665},[655,3966,744],{"class":719},[655,3968,747],{"class":665},[655,3970,750],{"class":719},[655,3972,3973],{"class":753},"\"table-upper\"",[655,3975,757],{"class":719},[655,3977,3978,3980,3982,3984,3986,3988,3991,3993,3995,3997,4000],{"class":657,"line":760},[655,3979,3269],{"class":719},[655,3981,378],{"class":665},[655,3983,1513],{"class":719},[655,3985,735],{"class":723},[655,3987,738],{"class":719},[655,3989,3990],{"class":665},"isNotEmpty",[655,3992,744],{"class":719},[655,3994,747],{"class":665},[655,3996,750],{"class":719},[655,3998,3999],{"class":753},"\"table-non-empty\"",[655,4001,757],{"class":719},[646,4003,4005],{"className":805,"code":4004,"filename":807,"language":808,"meta":651,"style":651},"import io.stoatflow.core.topology.Named;\nimport io.stoatflow.core.topology.Predicate;\nimport io.stoatflow.core.topology.ValueMapper;\n\nKTable\u003CString, String> upper = table\n    .mapValues((ValueMapper\u003CString, String>) v -> v.toUpperCase(), Named.as(\"table-upper\"))\n    .filter((Predicate\u003CString, String>) (k, v) -> !v.isEmpty(), Named.as(\"table-non-empty\"));\n",[323,4006,4007,4031,4055,4079,4083,4103,4154],{"__ignoreMap":651},[655,4008,4009,4011,4013,4015,4017,4019,4021,4023,4025,4027,4029],{"class":657,"line":658},[655,4010,662],{"class":661},[655,4012,817],{"class":719},[655,4014,400],{"class":723},[655,4016,822],{"class":719},[655,4018,400],{"class":723},[655,4020,827],{"class":719},[655,4022,400],{"class":723},[655,4024,832],{"class":719},[655,4026,400],{"class":723},[655,4028,452],{"class":719},[655,4030,839],{"class":723},[655,4032,4033,4035,4037,4039,4041,4043,4045,4047,4049,4051,4053],{"class":657,"line":699},[655,4034,662],{"class":661},[655,4036,817],{"class":719},[655,4038,400],{"class":723},[655,4040,822],{"class":719},[655,4042,400],{"class":723},[655,4044,827],{"class":719},[655,4046,400],{"class":723},[655,4048,832],{"class":719},[655,4050,400],{"class":723},[655,4052,1619],{"class":719},[655,4054,839],{"class":723},[655,4056,4057,4059,4061,4063,4065,4067,4069,4071,4073,4075,4077],{"class":657,"line":706},[655,4058,662],{"class":661},[655,4060,817],{"class":719},[655,4062,400],{"class":723},[655,4064,822],{"class":719},[655,4066,400],{"class":723},[655,4068,827],{"class":719},[655,4070,400],{"class":723},[655,4072,832],{"class":719},[655,4074,400],{"class":723},[655,4076,862],{"class":719},[655,4078,839],{"class":723},[655,4080,4081],{"class":657,"line":713},[655,4082,703],{"emptyLinePlaceholder":702},[655,4084,4085,4087,4089,4091,4093,4095,4097,4099,4101],{"class":657,"line":760},[655,4086,337],{"class":719},[655,4088,904],{"class":723},[655,4090,908],{"class":907},[655,4092,911],{"class":723},[655,4094,914],{"class":907},[655,4096,917],{"class":723},[655,4098,921],{"class":920},[655,4100,1343],{"class":723},[655,4102,3950],{"class":719},[655,4104,4105,4107,4109,4111,4113,4115,4117,4119,4121,4123,4125,4127,4129,4131,4133,4135,4137,4139,4141,4143,4145,4147,4150,4152],{"class":657,"line":765},[655,4106,3269],{"class":723},[655,4108,371],{"class":665},[655,4110,936],{"class":723},[655,4112,862],{"class":719},[655,4114,904],{"class":907},[655,4116,908],{"class":719},[655,4118,911],{"class":723},[655,4120,914],{"class":719},[655,4122,917],{"class":907},[655,4124,951],{"class":723},[655,4126,954],{"class":719},[655,4128,735],{"class":723},[655,4130,959],{"class":920},[655,4132,400],{"class":723},[655,4134,964],{"class":665},[655,4136,967],{"class":723},[655,4138,970],{"class":920},[655,4140,400],{"class":723},[655,4142,636],{"class":665},[655,4144,750],{"class":723},[655,4146,980],{"class":979},[655,4148,4149],{"class":753},"table-upper",[655,4151,980],{"class":979},[655,4153,757],{"class":723},[655,4155,4156,4158,4160,4162,4164,4166,4168,4170,4172,4174,4176,4178,4180,4182,4184,4186,4188,4190,4193,4195,4197,4199,4201,4203,4205,4207,4209,4212,4214],{"class":657,"line":771},[655,4157,3269],{"class":723},[655,4159,378],{"class":665},[655,4161,936],{"class":723},[655,4163,1619],{"class":719},[655,4165,904],{"class":907},[655,4167,908],{"class":719},[655,4169,911],{"class":723},[655,4171,914],{"class":719},[655,4173,917],{"class":907},[655,4175,951],{"class":723},[655,4177,1049],{"class":723},[655,4179,1052],{"class":719},[655,4181,911],{"class":723},[655,4183,959],{"class":719},[655,4185,951],{"class":723},[655,4187,1061],{"class":723},[655,4189,2126],{"class":907},[655,4191,4192],{"class":920},"v",[655,4194,400],{"class":723},[655,4196,1556],{"class":665},[655,4198,967],{"class":723},[655,4200,970],{"class":920},[655,4202,400],{"class":723},[655,4204,636],{"class":665},[655,4206,750],{"class":723},[655,4208,980],{"class":979},[655,4210,4211],{"class":753},"table-non-empty",[655,4213,980],{"class":979},[655,4215,987],{"class":723},[3881,4217,4219,4221],{"id":4218},"tostream-table-back-to-stream",[323,4220,416],{}," — table back to stream",[320,4223,4224,4227,4228,4230,4231,372,4234,432,4237,4240,4241,4243,4244,4246,4247,471],{},[323,4225,4226],{},"KTable.toStream"," converts the table's changelog into a ",[323,4229,333],{},": every update to a key becomes a record. This is how you write a table's results to a topic. (",[323,4232,4233],{},"count",[323,4235,4236],{},"reduce",[323,4238,4239],{},"aggregate"," produce a ",[323,4242,337],{},", so ",[323,4245,416],{}," is the usual bridge to a sink — see ",[343,4248,120],{"href":121},[682,4250,4251,4325],{"group":684},[646,4252,4254],{"className":648,"code":4253,"filename":688,"language":650,"meta":651,"style":651},"import io.stoatflow.core.topology.Named\n\ntable\n    .mapValues({ v -> v.uppercase() }, Named.`as`(\"table-upper\"))\n    .toStream(Named.`as`(\"to-stream\"))\n    .to(\"output-topic\")\n",[323,4255,4256,4262,4266,4271,4295,4312],{"__ignoreMap":651},[655,4257,4258,4260],{"class":657,"line":658},[655,4259,662],{"class":661},[655,4261,666],{"class":665},[655,4263,4264],{"class":657,"line":699},[655,4265,703],{"emptyLinePlaceholder":702},[655,4267,4268],{"class":657,"line":706},[655,4269,4270],{"class":719},"table\n",[655,4272,4273,4275,4277,4279,4281,4283,4285,4287,4289,4291,4293],{"class":657,"line":713},[655,4274,3269],{"class":719},[655,4276,371],{"class":665},[655,4278,732],{"class":719},[655,4280,735],{"class":723},[655,4282,738],{"class":719},[655,4284,741],{"class":665},[655,4286,744],{"class":719},[655,4288,747],{"class":665},[655,4290,750],{"class":719},[655,4292,3973],{"class":753},[655,4294,757],{"class":719},[655,4296,4297,4299,4301,4303,4305,4307,4310],{"class":657,"line":760},[655,4298,3269],{"class":719},[655,4300,416],{"class":665},[655,4302,3274],{"class":719},[655,4304,747],{"class":665},[655,4306,750],{"class":719},[655,4308,4309],{"class":753},"\"to-stream\"",[655,4311,757],{"class":719},[655,4313,4314,4316,4318,4320,4323],{"class":657,"line":765},[655,4315,3269],{"class":719},[655,4317,3383],{"class":665},[655,4319,750],{"class":719},[655,4321,4322],{"class":753},"\"output-topic\"",[655,4324,1239],{"class":719},[646,4326,4328],{"className":805,"code":4327,"filename":807,"language":808,"meta":651,"style":651},"import io.stoatflow.core.topology.Named;\nimport io.stoatflow.core.topology.ValueMapper;\n\ntable\n    .mapValues((ValueMapper\u003CString, String>) v -> v.toUpperCase(), Named.as(\"table-upper\"))\n    .toStream(Named.as(\"to-stream\"))\n    .to(\"output-topic\");\n",[323,4329,4330,4354,4378,4382,4386,4436,4461],{"__ignoreMap":651},[655,4331,4332,4334,4336,4338,4340,4342,4344,4346,4348,4350,4352],{"class":657,"line":658},[655,4333,662],{"class":661},[655,4335,817],{"class":719},[655,4337,400],{"class":723},[655,4339,822],{"class":719},[655,4341,400],{"class":723},[655,4343,827],{"class":719},[655,4345,400],{"class":723},[655,4347,832],{"class":719},[655,4349,400],{"class":723},[655,4351,452],{"class":719},[655,4353,839],{"class":723},[655,4355,4356,4358,4360,4362,4364,4366,4368,4370,4372,4374,4376],{"class":657,"line":699},[655,4357,662],{"class":661},[655,4359,817],{"class":719},[655,4361,400],{"class":723},[655,4363,822],{"class":719},[655,4365,400],{"class":723},[655,4367,827],{"class":719},[655,4369,400],{"class":723},[655,4371,832],{"class":719},[655,4373,400],{"class":723},[655,4375,862],{"class":719},[655,4377,839],{"class":723},[655,4379,4380],{"class":657,"line":706},[655,4381,703],{"emptyLinePlaceholder":702},[655,4383,4384],{"class":657,"line":713},[655,4385,4270],{"class":719},[655,4387,4388,4390,4392,4394,4396,4398,4400,4402,4404,4406,4408,4410,4412,4414,4416,4418,4420,4422,4424,4426,4428,4430,4432,4434],{"class":657,"line":760},[655,4389,3269],{"class":723},[655,4391,371],{"class":665},[655,4393,936],{"class":723},[655,4395,862],{"class":719},[655,4397,904],{"class":907},[655,4399,908],{"class":719},[655,4401,911],{"class":723},[655,4403,914],{"class":719},[655,4405,917],{"class":907},[655,4407,951],{"class":723},[655,4409,954],{"class":719},[655,4411,735],{"class":723},[655,4413,959],{"class":920},[655,4415,400],{"class":723},[655,4417,964],{"class":665},[655,4419,967],{"class":723},[655,4421,970],{"class":920},[655,4423,400],{"class":723},[655,4425,636],{"class":665},[655,4427,750],{"class":723},[655,4429,980],{"class":979},[655,4431,4149],{"class":753},[655,4433,980],{"class":979},[655,4435,757],{"class":723},[655,4437,4438,4440,4442,4444,4446,4448,4450,4452,4454,4457,4459],{"class":657,"line":765},[655,4439,3269],{"class":723},[655,4441,416],{"class":665},[655,4443,750],{"class":723},[655,4445,452],{"class":920},[655,4447,400],{"class":723},[655,4449,636],{"class":665},[655,4451,750],{"class":723},[655,4453,980],{"class":979},[655,4455,4456],{"class":753},"to-stream",[655,4458,980],{"class":979},[655,4460,757],{"class":723},[655,4462,4463,4465,4467,4469,4471,4474,4476],{"class":657,"line":771},[655,4464,3269],{"class":723},[655,4466,3383],{"class":665},[655,4468,750],{"class":723},[655,4470,980],{"class":979},[655,4472,4473],{"class":753},"output-topic",[655,4475,980],{"class":979},[655,4477,3783],{"class":723},[320,4479,4480,4481,4484,4485,4487],{},"There's a key-changing ",[323,4482,4483],{},"toStream(keyMapper, named)"," overload that derives a new key from each entry — like ",[323,4486,390],{},", it re-routes the resulting records to the lane that owns the new key.",[3881,4489,4491,4494],{"id":4490},"totable-stream-to-table",[323,4492,4493],{},"toTable"," — stream to table",[320,4496,4497,4499,4500,4502],{},[323,4498,420],{}," interprets a stream as a changelog: each record updates the key's value in the resulting table, and a null value is a tombstone that deletes the key. It preserves the key (no re-routing). Pass a ",[323,4501,3902],{}," to control the backing store and its name; without one StoatFlow auto-generates a store name.",[682,4504,4505,4610],{"group":684},[646,4506,4508],{"className":648,"code":4507,"filename":688,"language":650,"meta":651,"style":651},"import io.stoatflow.core.state.StateStore\nimport io.stoatflow.core.topology.Materialized\nimport org.apache.kafka.common.serialization.Serdes\n\nval latest = stream.toTable(\n    Materialized.`as`\u003CString, String, StateStore>(\"latest-by-key\")\n        .withKeySerde(Serdes.String())\n        .withValueSerde(Serdes.String()),\n)\n",[323,4509,4510,4517,4524,4531,4535,4550,4578,4593,4606],{"__ignoreMap":651},[655,4511,4512,4514],{"class":657,"line":658},[655,4513,662],{"class":661},[655,4515,4516],{"class":665}," io.stoatflow.core.state.StateStore\n",[655,4518,4519,4521],{"class":657,"line":699},[655,4520,662],{"class":661},[655,4522,4523],{"class":665}," io.stoatflow.core.topology.Materialized\n",[655,4525,4526,4528],{"class":657,"line":706},[655,4527,662],{"class":661},[655,4529,4530],{"class":665}," org.apache.kafka.common.serialization.Serdes\n",[655,4532,4533],{"class":657,"line":713},[655,4534,703],{"emptyLinePlaceholder":702},[655,4536,4537,4539,4542,4544,4546,4548],{"class":657,"line":760},[655,4538,716],{"class":661},[655,4540,4541],{"class":719}," latest ",[655,4543,724],{"class":723},[655,4545,727],{"class":719},[655,4547,4493],{"class":665},[655,4549,1177],{"class":719},[655,4551,4552,4555,4557,4559,4561,4563,4565,4567,4570,4573,4576],{"class":657,"line":765},[655,4553,4554],{"class":719},"    Materialized.",[655,4556,747],{"class":665},[655,4558,904],{"class":719},[655,4560,908],{"class":3239},[655,4562,372],{"class":719},[655,4564,908],{"class":3239},[655,4566,372],{"class":719},[655,4568,4569],{"class":3239},"StateStore",[655,4571,4572],{"class":719},">(",[655,4574,4575],{"class":753},"\"latest-by-key\"",[655,4577,1239],{"class":719},[655,4579,4580,4583,4586,4589,4591],{"class":657,"line":771},[655,4581,4582],{"class":719},"        .",[655,4584,4585],{"class":665},"withKeySerde",[655,4587,4588],{"class":719},"(Serdes.",[655,4590,908],{"class":665},[655,4592,2137],{"class":719},[655,4594,4595,4597,4600,4602,4604],{"class":657,"line":990},[655,4596,4582],{"class":719},[655,4598,4599],{"class":665},"withValueSerde",[655,4601,4588],{"class":719},[655,4603,908],{"class":665},[655,4605,2156],{"class":719},[655,4607,4608],{"class":657,"line":995},[655,4609,1239],{"class":719},[646,4611,4613],{"className":805,"code":4612,"filename":807,"language":808,"meta":651,"style":651},"import io.stoatflow.core.state.StateStore;\nimport io.stoatflow.core.topology.Materialized;\nimport org.apache.kafka.common.serialization.Serdes;\n\nKTable\u003CString, String> latest = stream.toTable(\n    Materialized.\u003CString, String, StateStore>as(\"latest-by-key\")\n        .withKeySerde(Serdes.String())\n        .withValueSerde(Serdes.String()));\n",[323,4614,4615,4639,4663,4697,4701,4728,4763,4779],{"__ignoreMap":651},[655,4616,4617,4619,4621,4623,4625,4627,4629,4631,4633,4635,4637],{"class":657,"line":658},[655,4618,662],{"class":661},[655,4620,817],{"class":719},[655,4622,400],{"class":723},[655,4624,822],{"class":719},[655,4626,400],{"class":723},[655,4628,827],{"class":719},[655,4630,400],{"class":723},[655,4632,1263],{"class":719},[655,4634,400],{"class":723},[655,4636,4569],{"class":719},[655,4638,839],{"class":723},[655,4640,4641,4643,4645,4647,4649,4651,4653,4655,4657,4659,4661],{"class":657,"line":699},[655,4642,662],{"class":661},[655,4644,817],{"class":719},[655,4646,400],{"class":723},[655,4648,822],{"class":719},[655,4650,400],{"class":723},[655,4652,827],{"class":719},[655,4654,400],{"class":723},[655,4656,832],{"class":719},[655,4658,400],{"class":723},[655,4660,3902],{"class":719},[655,4662,839],{"class":723},[655,4664,4665,4667,4670,4672,4675,4677,4680,4682,4685,4687,4690,4692,4695],{"class":657,"line":706},[655,4666,662],{"class":661},[655,4668,4669],{"class":719}," org",[655,4671,400],{"class":723},[655,4673,4674],{"class":719},"apache",[655,4676,400],{"class":723},[655,4678,4679],{"class":719},"kafka",[655,4681,400],{"class":723},[655,4683,4684],{"class":719},"common",[655,4686,400],{"class":723},[655,4688,4689],{"class":719},"serialization",[655,4691,400],{"class":723},[655,4693,4694],{"class":719},"Serdes",[655,4696,839],{"class":723},[655,4698,4699],{"class":657,"line":713},[655,4700,703],{"emptyLinePlaceholder":702},[655,4702,4703,4705,4707,4709,4711,4713,4715,4718,4720,4722,4724,4726],{"class":657,"line":760},[655,4704,337],{"class":719},[655,4706,904],{"class":723},[655,4708,908],{"class":907},[655,4710,911],{"class":723},[655,4712,914],{"class":907},[655,4714,917],{"class":723},[655,4716,4717],{"class":920}," latest",[655,4719,1343],{"class":723},[655,4721,1346],{"class":920},[655,4723,400],{"class":723},[655,4725,4493],{"class":665},[655,4727,1177],{"class":723},[655,4729,4730,4733,4735,4737,4739,4741,4743,4745,4748,4750,4752,4754,4756,4759,4761],{"class":657,"line":765},[655,4731,4732],{"class":719},"    Materialized",[655,4734,400],{"class":723},[655,4736,904],{"class":907},[655,4738,908],{"class":719},[655,4740,911],{"class":723},[655,4742,914],{"class":719},[655,4744,911],{"class":723},[655,4746,4747],{"class":719}," StateStore",[655,4749,917],{"class":907},[655,4751,636],{"class":665},[655,4753,750],{"class":723},[655,4755,980],{"class":979},[655,4757,4758],{"class":753},"latest-by-key",[655,4760,980],{"class":979},[655,4762,1239],{"class":723},[655,4764,4765,4767,4769,4771,4773,4775,4777],{"class":657,"line":771},[655,4766,4582],{"class":723},[655,4768,4585],{"class":665},[655,4770,750],{"class":723},[655,4772,4694],{"class":920},[655,4774,400],{"class":723},[655,4776,908],{"class":665},[655,4778,2137],{"class":723},[655,4780,4781,4783,4785,4787,4789,4791,4793],{"class":657,"line":990},[655,4782,4582],{"class":723},[655,4784,4599],{"class":665},[655,4786,750],{"class":723},[655,4788,4694],{"class":920},[655,4790,400],{"class":723},[655,4792,908],{"class":665},[655,4794,4795],{"class":723},"()));\n",[455,4797,4799],{"id":4798},"putting-it-together","Putting it together",[320,4801,4802,4803,4806],{},"A complete stateless pipeline: read a topic, re-key, filter, uppercase, and write the result. (Adapted from the ",[323,4804,4805],{},"map-filter"," example.)",[682,4808,4809,5101],{"group":684},[646,4810,4812],{"className":648,"code":4811,"filename":688,"language":650,"meta":651,"style":651},"import io.stoatflow.core.state.KeyValue\nimport io.stoatflow.core.topology.Consumed\nimport io.stoatflow.core.topology.Named\nimport io.stoatflow.core.topology.Produced\nimport io.stoatflow.core.topology.StreamsBuilder\nimport org.apache.kafka.common.serialization.Serdes\n\nfun buildTopology(builder: StreamsBuilder) {\n    builder\n        .stream(\"input-topic\", Consumed.`as`\u003CLong, String>(\"source\").withKeySerde(Serdes.Long()))\n        .map({ key, value -> KeyValue(value.substring(0, 3), \"$key:$value\") }, Named.`as`(\"rekey\"))\n        .filter({ _, value -> value.length > 5 }, Named.`as`(\"keep-long\"))\n        .mapValues({ value -> value.uppercase() }, Named.`as`(\"uppercase\"))\n        .to(\n            \"output-topic\",\n            Produced.`as`\u003CString, String>(\"sink\")\n                .withKeySerde(Serdes.String())\n                .withValueSerde(Serdes.String()),\n        )\n}\n",[323,4813,4814,4820,4827,4833,4840,4847,4853,4857,4873,4878,4917,4963,4995,5024,5032,5039,5062,5076,5089,5095],{"__ignoreMap":651},[655,4815,4816,4818],{"class":657,"line":658},[655,4817,662],{"class":661},[655,4819,1151],{"class":665},[655,4821,4822,4824],{"class":657,"line":699},[655,4823,662],{"class":661},[655,4825,4826],{"class":665}," io.stoatflow.core.topology.Consumed\n",[655,4828,4829,4831],{"class":657,"line":706},[655,4830,662],{"class":661},[655,4832,666],{"class":665},[655,4834,4835,4837],{"class":657,"line":713},[655,4836,662],{"class":661},[655,4838,4839],{"class":665}," io.stoatflow.core.topology.Produced\n",[655,4841,4842,4844],{"class":657,"line":760},[655,4843,662],{"class":661},[655,4845,4846],{"class":665}," io.stoatflow.core.topology.StreamsBuilder\n",[655,4848,4849,4851],{"class":657,"line":765},[655,4850,662],{"class":661},[655,4852,4530],{"class":665},[655,4854,4855],{"class":657,"line":771},[655,4856,703],{"emptyLinePlaceholder":702},[655,4858,4859,4862,4865,4868,4870],{"class":657,"line":990},[655,4860,4861],{"class":661},"fun",[655,4863,4864],{"class":665}," buildTopology",[655,4866,4867],{"class":719},"(builder: ",[655,4869,347],{"class":3239},[655,4871,4872],{"class":719},") {\n",[655,4874,4875],{"class":657,"line":995},[655,4876,4877],{"class":719},"    builder\n",[655,4879,4880,4882,4884,4886,4889,4892,4894,4896,4898,4900,4902,4904,4907,4909,4911,4913,4915],{"class":657,"line":1000},[655,4881,4582],{"class":719},[655,4883,2006],{"class":665},[655,4885,750],{"class":719},[655,4887,4888],{"class":753},"\"input-topic\"",[655,4890,4891],{"class":719},", Consumed.",[655,4893,747],{"class":665},[655,4895,904],{"class":719},[655,4897,1364],{"class":3239},[655,4899,372],{"class":719},[655,4901,908],{"class":3239},[655,4903,4572],{"class":719},[655,4905,4906],{"class":753},"\"source\"",[655,4908,351],{"class":719},[655,4910,4585],{"class":665},[655,4912,4588],{"class":719},[655,4914,1364],{"class":665},[655,4916,2505],{"class":719},[655,4918,4919,4921,4923,4926,4928,4930,4932,4934,4936,4938,4940,4942,4944,4946,4948,4950,4952,4954,4956,4958,4961],{"class":657,"line":1020},[655,4920,4582],{"class":719},[655,4922,375],{"class":665},[655,4924,4925],{"class":719},"({ key, ",[655,4927,1185],{"class":907},[655,4929,1061],{"class":723},[655,4931,1190],{"class":665},[655,4933,750],{"class":719},[655,4935,1185],{"class":907},[655,4937,400],{"class":719},[655,4939,1199],{"class":665},[655,4941,750],{"class":719},[655,4943,1205],{"class":1204},[655,4945,372],{"class":719},[655,4947,1210],{"class":1204},[655,4949,1213],{"class":719},[655,4951,1216],{"class":753},[655,4953,2815],{"class":719},[655,4955,747],{"class":665},[655,4957,750],{"class":719},[655,4959,4960],{"class":753},"\"rekey\"",[655,4962,757],{"class":719},[655,4964,4965,4967,4969,4972,4974,4976,4978,4981,4983,4985,4987,4989,4991,4993],{"class":657,"line":1086},[655,4966,4582],{"class":719},[655,4968,378],{"class":665},[655,4970,4971],{"class":719},"({ _, ",[655,4973,1185],{"class":907},[655,4975,1061],{"class":723},[655,4977,1394],{"class":907},[655,4979,4980],{"class":719},".length ",[655,4982,917],{"class":907},[655,4984,1523],{"class":1204},[655,4986,793],{"class":719},[655,4988,747],{"class":665},[655,4990,750],{"class":719},[655,4992,1532],{"class":753},[655,4994,757],{"class":719},[655,4996,4997,4999,5001,5004,5006,5008,5010,5012,5014,5016,5018,5020,5022],{"class":657,"line":3751},[655,4998,4582],{"class":719},[655,5000,371],{"class":665},[655,5002,5003],{"class":719},"({ ",[655,5005,1185],{"class":907},[655,5007,1061],{"class":723},[655,5009,1394],{"class":907},[655,5011,400],{"class":719},[655,5013,741],{"class":665},[655,5015,744],{"class":719},[655,5017,747],{"class":665},[655,5019,750],{"class":719},[655,5021,754],{"class":753},[655,5023,757],{"class":719},[655,5025,5026,5028,5030],{"class":657,"line":3786},[655,5027,4582],{"class":719},[655,5029,3383],{"class":665},[655,5031,1177],{"class":719},[655,5033,5034,5037],{"class":657,"line":3819},[655,5035,5036],{"class":753},"            \"output-topic\"",[655,5038,1083],{"class":719},[655,5040,5042,5045,5047,5049,5051,5053,5055,5057,5060],{"class":657,"line":5041},16,[655,5043,5044],{"class":719},"            Produced.",[655,5046,747],{"class":665},[655,5048,904],{"class":719},[655,5050,908],{"class":3239},[655,5052,372],{"class":719},[655,5054,908],{"class":3239},[655,5056,4572],{"class":719},[655,5058,5059],{"class":753},"\"sink\"",[655,5061,1239],{"class":719},[655,5063,5065,5068,5070,5072,5074],{"class":657,"line":5064},17,[655,5066,5067],{"class":719},"                .",[655,5069,4585],{"class":665},[655,5071,4588],{"class":719},[655,5073,908],{"class":665},[655,5075,2137],{"class":719},[655,5077,5079,5081,5083,5085,5087],{"class":657,"line":5078},18,[655,5080,5067],{"class":719},[655,5082,4599],{"class":665},[655,5084,4588],{"class":719},[655,5086,908],{"class":665},[655,5088,2156],{"class":719},[655,5090,5092],{"class":657,"line":5091},19,[655,5093,5094],{"class":719},"        )\n",[655,5096,5098],{"class":657,"line":5097},20,[655,5099,5100],{"class":719},"}\n",[646,5102,5104],{"className":805,"code":5103,"filename":807,"language":808,"meta":651,"style":651},"import io.stoatflow.core.state.KeyValue;\nimport io.stoatflow.core.topology.Consumed;\nimport io.stoatflow.core.topology.KStream;\nimport io.stoatflow.core.topology.KeyValueMapper;\nimport io.stoatflow.core.topology.Named;\nimport io.stoatflow.core.topology.Predicate;\nimport io.stoatflow.core.topology.Produced;\nimport io.stoatflow.core.topology.StreamsBuilder;\nimport io.stoatflow.core.topology.ValueMapper;\nimport org.apache.kafka.common.serialization.Serdes;\n\nvoid buildTopology(StreamsBuilder builder) {\n    KStream\u003CLong, String> input =\n        builder.stream(\"input-topic\", Consumed.\u003CLong, String>as(\"source\").withKeySerde(Serdes.Long()));\n    input\n        .map((KeyValueMapper\u003CLong, String, KeyValue\u003CString, String>>) (key, value) ->\n                new KeyValue\u003C>(value.substring(0, 3), key + \":\" + value),\n            Named.as(\"rekey\"))\n        .filter((Predicate\u003CString, String>) (k, value) -> value.length() > 5, Named.as(\"keep-long\"))\n        .mapValues((ValueMapper\u003CString, String>) String::toUpperCase, Named.as(\"uppercase\"))\n        .to(\n            \"output-topic\",\n            Produced.\u003CString, String>as(\"sink\")\n                .withKeySerde(Serdes.String())\n                .withValueSerde(Serdes.String()));\n}\n",[323,5105,5106,5130,5155,5179,5203,5227,5251,5276,5300,5324,5352,5356,5373,5393,5453,5458,5504,5545,5565,5629,5676,5685,5697,5728,5745,5762],{"__ignoreMap":651},[655,5107,5108,5110,5112,5114,5116,5118,5120,5122,5124,5126,5128],{"class":657,"line":658},[655,5109,662],{"class":661},[655,5111,817],{"class":719},[655,5113,400],{"class":723},[655,5115,822],{"class":719},[655,5117,400],{"class":723},[655,5119,827],{"class":719},[655,5121,400],{"class":723},[655,5123,1263],{"class":719},[655,5125,400],{"class":723},[655,5127,1268],{"class":719},[655,5129,839],{"class":723},[655,5131,5132,5134,5136,5138,5140,5142,5144,5146,5148,5150,5153],{"class":657,"line":699},[655,5133,662],{"class":661},[655,5135,817],{"class":719},[655,5137,400],{"class":723},[655,5139,822],{"class":719},[655,5141,400],{"class":723},[655,5143,827],{"class":719},[655,5145,400],{"class":723},[655,5147,832],{"class":719},[655,5149,400],{"class":723},[655,5151,5152],{"class":719},"Consumed",[655,5154,839],{"class":723},[655,5156,5157,5159,5161,5163,5165,5167,5169,5171,5173,5175,5177],{"class":657,"line":706},[655,5158,662],{"class":661},[655,5160,817],{"class":719},[655,5162,400],{"class":723},[655,5164,822],{"class":719},[655,5166,400],{"class":723},[655,5168,827],{"class":719},[655,5170,400],{"class":723},[655,5172,832],{"class":719},[655,5174,400],{"class":723},[655,5176,333],{"class":719},[655,5178,839],{"class":723},[655,5180,5181,5183,5185,5187,5189,5191,5193,5195,5197,5199,5201],{"class":657,"line":713},[655,5182,662],{"class":661},[655,5184,817],{"class":719},[655,5186,400],{"class":723},[655,5188,822],{"class":719},[655,5190,400],{"class":723},[655,5192,827],{"class":719},[655,5194,400],{"class":723},[655,5196,832],{"class":719},[655,5198,400],{"class":723},[655,5200,1293],{"class":719},[655,5202,839],{"class":723},[655,5204,5205,5207,5209,5211,5213,5215,5217,5219,5221,5223,5225],{"class":657,"line":760},[655,5206,662],{"class":661},[655,5208,817],{"class":719},[655,5210,400],{"class":723},[655,5212,822],{"class":719},[655,5214,400],{"class":723},[655,5216,827],{"class":719},[655,5218,400],{"class":723},[655,5220,832],{"class":719},[655,5222,400],{"class":723},[655,5224,452],{"class":719},[655,5226,839],{"class":723},[655,5228,5229,5231,5233,5235,5237,5239,5241,5243,5245,5247,5249],{"class":657,"line":765},[655,5230,662],{"class":661},[655,5232,817],{"class":719},[655,5234,400],{"class":723},[655,5236,822],{"class":719},[655,5238,400],{"class":723},[655,5240,827],{"class":719},[655,5242,400],{"class":723},[655,5244,832],{"class":719},[655,5246,400],{"class":723},[655,5248,1619],{"class":719},[655,5250,839],{"class":723},[655,5252,5253,5255,5257,5259,5261,5263,5265,5267,5269,5271,5274],{"class":657,"line":771},[655,5254,662],{"class":661},[655,5256,817],{"class":719},[655,5258,400],{"class":723},[655,5260,822],{"class":719},[655,5262,400],{"class":723},[655,5264,827],{"class":719},[655,5266,400],{"class":723},[655,5268,832],{"class":719},[655,5270,400],{"class":723},[655,5272,5273],{"class":719},"Produced",[655,5275,839],{"class":723},[655,5277,5278,5280,5282,5284,5286,5288,5290,5292,5294,5296,5298],{"class":657,"line":990},[655,5279,662],{"class":661},[655,5281,817],{"class":719},[655,5283,400],{"class":723},[655,5285,822],{"class":719},[655,5287,400],{"class":723},[655,5289,827],{"class":719},[655,5291,400],{"class":723},[655,5293,832],{"class":719},[655,5295,400],{"class":723},[655,5297,347],{"class":719},[655,5299,839],{"class":723},[655,5301,5302,5304,5306,5308,5310,5312,5314,5316,5318,5320,5322],{"class":657,"line":995},[655,5303,662],{"class":661},[655,5305,817],{"class":719},[655,5307,400],{"class":723},[655,5309,822],{"class":719},[655,5311,400],{"class":723},[655,5313,827],{"class":719},[655,5315,400],{"class":723},[655,5317,832],{"class":719},[655,5319,400],{"class":723},[655,5321,862],{"class":719},[655,5323,839],{"class":723},[655,5325,5326,5328,5330,5332,5334,5336,5338,5340,5342,5344,5346,5348,5350],{"class":657,"line":1000},[655,5327,662],{"class":661},[655,5329,4669],{"class":719},[655,5331,400],{"class":723},[655,5333,4674],{"class":719},[655,5335,400],{"class":723},[655,5337,4679],{"class":719},[655,5339,400],{"class":723},[655,5341,4684],{"class":719},[655,5343,400],{"class":723},[655,5345,4689],{"class":719},[655,5347,400],{"class":723},[655,5349,4694],{"class":719},[655,5351,839],{"class":723},[655,5353,5354],{"class":657,"line":1020},[655,5355,703],{"emptyLinePlaceholder":702},[655,5357,5358,5361,5363,5365,5368,5370],{"class":657,"line":1086},[655,5359,5360],{"class":907},"void",[655,5362,4864],{"class":665},[655,5364,750],{"class":723},[655,5366,5367],{"class":719},"StreamsBuilder builder",[655,5369,951],{"class":723},[655,5371,5372],{"class":723}," {\n",[655,5374,5375,5378,5380,5382,5384,5386,5388,5391],{"class":657,"line":3751},[655,5376,5377],{"class":719},"    KStream",[655,5379,904],{"class":723},[655,5381,1364],{"class":907},[655,5383,911],{"class":723},[655,5385,914],{"class":907},[655,5387,917],{"class":723},[655,5389,5390],{"class":920}," input",[655,5392,924],{"class":723},[655,5394,5395,5398,5400,5402,5404,5406,5409,5411,5413,5416,5418,5420,5422,5424,5426,5428,5430,5432,5434,5437,5439,5441,5443,5445,5447,5449,5451],{"class":657,"line":3786},[655,5396,5397],{"class":920},"        builder",[655,5399,400],{"class":723},[655,5401,2006],{"class":665},[655,5403,750],{"class":723},[655,5405,980],{"class":979},[655,5407,5408],{"class":753},"input-topic",[655,5410,980],{"class":979},[655,5412,911],{"class":723},[655,5414,5415],{"class":719}," Consumed",[655,5417,400],{"class":723},[655,5419,904],{"class":907},[655,5421,1364],{"class":719},[655,5423,911],{"class":723},[655,5425,914],{"class":719},[655,5427,917],{"class":907},[655,5429,636],{"class":665},[655,5431,750],{"class":723},[655,5433,980],{"class":979},[655,5435,5436],{"class":753},"source",[655,5438,980],{"class":979},[655,5440,351],{"class":723},[655,5442,4585],{"class":665},[655,5444,750],{"class":723},[655,5446,4694],{"class":920},[655,5448,400],{"class":723},[655,5450,1364],{"class":665},[655,5452,4795],{"class":723},[655,5454,5455],{"class":657,"line":3819},[655,5456,5457],{"class":719},"    input\n",[655,5459,5460,5462,5464,5466,5468,5470,5472,5474,5476,5478,5480,5482,5484,5486,5488,5490,5492,5494,5496,5498,5500,5502],{"class":657,"line":5041},[655,5461,4582],{"class":723},[655,5463,375],{"class":665},[655,5465,936],{"class":723},[655,5467,1293],{"class":719},[655,5469,904],{"class":907},[655,5471,1364],{"class":719},[655,5473,911],{"class":723},[655,5475,914],{"class":719},[655,5477,911],{"class":723},[655,5479,1190],{"class":719},[655,5481,904],{"class":907},[655,5483,908],{"class":719},[655,5485,911],{"class":723},[655,5487,914],{"class":719},[655,5489,1383],{"class":907},[655,5491,951],{"class":723},[655,5493,1049],{"class":723},[655,5495,464],{"class":719},[655,5497,911],{"class":723},[655,5499,1394],{"class":719},[655,5501,951],{"class":723},[655,5503,1399],{"class":723},[655,5505,5506,5509,5511,5513,5515,5517,5519,5521,5523,5525,5527,5529,5531,5533,5535,5537,5539,5541,5543],{"class":657,"line":5064},[655,5507,5508],{"class":661},"                new",[655,5510,1190],{"class":719},[655,5512,1409],{"class":723},[655,5514,1185],{"class":920},[655,5516,400],{"class":723},[655,5518,1199],{"class":665},[655,5520,750],{"class":723},[655,5522,1205],{"class":1204},[655,5524,911],{"class":723},[655,5526,1424],{"class":1204},[655,5528,1427],{"class":723},[655,5530,1430],{"class":719},[655,5532,1067],{"class":907},[655,5534,1070],{"class":979},[655,5536,1073],{"class":753},[655,5538,980],{"class":979},[655,5540,1078],{"class":907},[655,5542,1394],{"class":719},[655,5544,1234],{"class":723},[655,5546,5547,5550,5552,5554,5556,5558,5561,5563],{"class":657,"line":5078},[655,5548,5549],{"class":920},"            Named",[655,5551,400],{"class":723},[655,5553,636],{"class":665},[655,5555,750],{"class":723},[655,5557,980],{"class":979},[655,5559,5560],{"class":753},"rekey",[655,5562,980],{"class":979},[655,5564,757],{"class":723},[655,5566,5567,5569,5571,5573,5575,5577,5579,5581,5583,5585,5587,5589,5591,5593,5595,5597,5599,5601,5603,5605,5607,5609,5611,5613,5615,5617,5619,5621,5623,5625,5627],{"class":657,"line":5091},[655,5568,4582],{"class":723},[655,5570,378],{"class":665},[655,5572,936],{"class":723},[655,5574,1619],{"class":719},[655,5576,904],{"class":907},[655,5578,908],{"class":719},[655,5580,911],{"class":723},[655,5582,914],{"class":719},[655,5584,917],{"class":907},[655,5586,951],{"class":723},[655,5588,1049],{"class":723},[655,5590,1052],{"class":719},[655,5592,911],{"class":723},[655,5594,1394],{"class":719},[655,5596,951],{"class":723},[655,5598,1061],{"class":723},[655,5600,1394],{"class":920},[655,5602,400],{"class":723},[655,5604,1687],{"class":665},[655,5606,1690],{"class":723},[655,5608,1693],{"class":907},[655,5610,1523],{"class":1204},[655,5612,911],{"class":723},[655,5614,970],{"class":920},[655,5616,400],{"class":723},[655,5618,636],{"class":665},[655,5620,750],{"class":723},[655,5622,980],{"class":979},[655,5624,1710],{"class":753},[655,5626,980],{"class":979},[655,5628,757],{"class":723},[655,5630,5631,5633,5635,5637,5639,5641,5643,5645,5647,5649,5651,5653,5656,5658,5660,5662,5664,5666,5668,5670,5672,5674],{"class":657,"line":5097},[655,5632,4582],{"class":723},[655,5634,371],{"class":665},[655,5636,936],{"class":723},[655,5638,862],{"class":719},[655,5640,904],{"class":907},[655,5642,908],{"class":719},[655,5644,911],{"class":723},[655,5646,914],{"class":719},[655,5648,917],{"class":907},[655,5650,951],{"class":723},[655,5652,914],{"class":719},[655,5654,5655],{"class":661},"::",[655,5657,964],{"class":719},[655,5659,911],{"class":723},[655,5661,970],{"class":920},[655,5663,400],{"class":723},[655,5665,636],{"class":665},[655,5667,750],{"class":723},[655,5669,980],{"class":979},[655,5671,741],{"class":753},[655,5673,980],{"class":979},[655,5675,757],{"class":723},[655,5677,5679,5681,5683],{"class":657,"line":5678},21,[655,5680,4582],{"class":723},[655,5682,3383],{"class":665},[655,5684,1177],{"class":723},[655,5686,5688,5691,5693,5695],{"class":657,"line":5687},22,[655,5689,5690],{"class":979},"            \"",[655,5692,4473],{"class":753},[655,5694,980],{"class":979},[655,5696,1083],{"class":723},[655,5698,5700,5703,5705,5707,5709,5711,5713,5715,5717,5719,5721,5724,5726],{"class":657,"line":5699},23,[655,5701,5702],{"class":719},"            Produced",[655,5704,400],{"class":723},[655,5706,904],{"class":907},[655,5708,908],{"class":719},[655,5710,911],{"class":723},[655,5712,914],{"class":719},[655,5714,917],{"class":907},[655,5716,636],{"class":665},[655,5718,750],{"class":723},[655,5720,980],{"class":979},[655,5722,5723],{"class":753},"sink",[655,5725,980],{"class":979},[655,5727,1239],{"class":723},[655,5729,5731,5733,5735,5737,5739,5741,5743],{"class":657,"line":5730},24,[655,5732,5067],{"class":723},[655,5734,4585],{"class":665},[655,5736,750],{"class":723},[655,5738,4694],{"class":920},[655,5740,400],{"class":723},[655,5742,908],{"class":665},[655,5744,2137],{"class":723},[655,5746,5748,5750,5752,5754,5756,5758,5760],{"class":657,"line":5747},25,[655,5749,5067],{"class":723},[655,5751,4599],{"class":665},[655,5753,750],{"class":723},[655,5755,4694],{"class":920},[655,5757,400],{"class":723},[655,5759,908],{"class":665},[655,5761,4795],{"class":723},[655,5763,5765],{"class":657,"line":5764},26,[655,5766,5100],{"class":723},[455,5768,5770],{"id":5769},"next-steps","Next steps",[356,5772,5773,5790,5797,5808,5815],{},[359,5774,5775,5779,5780,372,5782,372,5784,372,5786,372,5788,400],{},[362,5776,5777],{},[343,5778,120],{"href":121}," — ",[323,5781,2558],{},[323,5783,435],{},[323,5785,4233],{},[323,5787,4236],{},[323,5789,4239],{},[359,5791,5792,5796],{},[362,5793,5794],{},[343,5795,130],{"href":131}," — stream-table, stream-stream, and table-table joins.",[359,5798,5799,5779,5803,372,5805,5807],{},[362,5800,5801],{},[343,5802,4694],{"href":146},[323,5804,5152],{},[323,5806,5273],{},", and serde resolution.",[359,5809,5810,5814],{},[362,5811,5812],{},[343,5813,57],{"href":58}," — how key affinity and re-routing work.",[359,5816,5817,5822],{},[362,5818,5819],{},[343,5820,5821],{"href":106},"Testing"," — verify these operators with the in-memory test driver.",[5824,5825,5826],"style",{},"html pre.shiki code .sbBg2, html code.shiki .sbBg2{--shiki-default:#1E754F}html pre.shiki code .sySUi, html code.shiki .sySUi{--shiki-default:#59873A}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .s8zF2, html code.shiki .s8zF2{--shiki-default:#A0ADA0}html pre.shiki code .suHK_, html code.shiki .suHK_{--shiki-default:#393A34}html pre.shiki code .sYZai, html code.shiki .sYZai{--shiki-default:#999999}html pre.shiki code .spphp, html code.shiki .spphp{--shiki-default:#B56959}html pre.shiki code .si04Y, html code.shiki .si04Y{--shiki-default:#AB5959}html pre.shiki code .svycV, html code.shiki .svycV{--shiki-default:#B07D48}html pre.shiki code .sSP4y, html code.shiki .sSP4y{--shiki-default:#B5695977}html pre.shiki code .s-TwI, html code.shiki .s-TwI{--shiki-default:#2F798A}html pre.shiki code .sEi1f, html code.shiki .sEi1f{--shiki-default:#A65E2B}html pre.shiki code .sUxyF, html code.shiki .sUxyF{--shiki-default:#2E8F82}",{"title":651,"searchDepth":699,"depth":699,"links":5828},[5829,5830,5831,5833,5835,5837,5839,5841,5843,5845,5847,5855,5856],{"id":457,"depth":699,"text":458},{"id":626,"depth":699,"text":627},{"id":672,"depth":699,"text":5832},"Value transforms — mapValues",{"id":1121,"depth":699,"text":5834},"Key + value transform — map",{"id":1467,"depth":699,"text":5836},"Filtering — filter and filterNot",{"id":1797,"depth":699,"text":5838},"One-to-many — flatMapValues and flatMap",{"id":2543,"depth":699,"text":5840},"Re-keying — selectKey",{"id":2758,"depth":699,"text":5842},"Side effects — peek",{"id":3001,"depth":699,"text":5844},"Combining streams — merge",{"id":3144,"depth":699,"text":5846},"Branching — split",{"id":3865,"depth":699,"text":3866,"children":5848},[5849,5851,5853],{"id":3883,"depth":706,"text":5850},"mapValues and filter",{"id":4218,"depth":706,"text":5852},"toStream — table back to stream",{"id":4490,"depth":706,"text":5854},"toTable — stream to table",{"id":4798,"depth":699,"text":4799},{"id":5769,"depth":699,"text":5770},"Stateless stream transforms (map, filter, flatMap, selectKey, branch, merge) and KTable basics — with the rules for when a key change forces records onto a different lane.","md",{},{"icon":118},"how-to",{"title":115,"description":5857},"989-ywP-TuVxh6OJGuNVqi7GgmOPtmrcR5m67ibdiqo",[5865,5867],{"title":110,"path":111,"stem":112,"description":5866,"icon":113,"children":-1},"Read records into a topology with builder.stream \u002F table \u002F globalTable and Consumed, and write them back out with to() and Produced — serdes, offset reset, watermarks, partitioners, and the fan-out rule.",{"title":120,"path":121,"stem":122,"description":5868,"icon":123,"children":-1},"Group records by key and fold them into running totals — count, reduce, aggregate on grouped streams and grouped tables, with the result backed by a state store.",1783713358002]