2016-05-26 3 views
0

Je veux analyserflux Akka Parse à la source

val flow : FlowOps = Source(1 to 10).map(_+1) 

à un Source mais ressemble il n'y a pas une façon simple. Je l'ai fait cette solution de contournement

Source.fromGraph(

     GraphDSL.create() { builder => 

     val flow = Source(1 to 10).map(_+1) 

     SourceShape(builder.add(flow).out) 
     } 
    ) 

Semble surpuissant pour transformer un flux simple à un graphique juste pour obtenir à nouveau un flux simple. Y a-t-il un moyen plus simple?

Répondre

2

Si je comprends bien, vous voulez utiliser Source(1 to 10).map(_ + 1) comme une valeur de type Source[Int, _], non? Mais vous n'avez pas besoin de faire quelque chose de spécial pour cela, car map() renvoie déjà un Source du type approprié. Si vous écrivez juste

val source = Source(1 to 10).map(_ + 1) 

alors source aura le type Source[Int, NotUsed]. Vous pouvez le vérifier facilement en mettant la signature appropriée explicitement:

val source: Source[Int, NotUsed] = Source(1 to 10).map(_ + 1) 

Je ne suis même pas sûr de savoir pourquoi vous avez utilisé FlowOps annotation de type tout. Comme le suggère son scaladoc, FlowOps fait partie de l'API interne akka-stream et ne devrait pas être utilisé en dehors de la bibliothèque elle-même.

+0

Ok, je suis un peu confus maintenant et je pense que c'est à cause des documents intellij. Si je tape: 'Source (1 à 10) .map (_. ToString)' intellij montre ce type: 'Source [Int, NotUsed] #Repr [String]'. Qu'est-ce que cela signifie ?? – RoberMP

+1

@RoberMP, ce modèle est similaire à celui utilisé dans les traits de collections Scala '* Like', par ex. 'TraversableLike [+ T, + Repr]'. 'Repr' désigne (grosso modo) le type qui implémente le trait. Si vous ouvrez la source 'Source' (sans jeu de mots), vous trouverez que' Repr [O] 'est défini comme' Source [O, Mat] ', c'est-à-dire une source avec le même type de valeur matérialisée que appelez 'map()', mais avec un type d'élément différent. –

+1

@RoberMP, ceci est nécessaire car des opérations comme 'map()' sont définies dans 'FlowOps' qui est étendu à la fois par' Source' et 'Flow', mais vous voudriez' flow.map() 'pour retourner' Flow' mais 'source.map()' pour retourner 'Source'. Sans une sorte de modèle 'Repr'', l'opération map() 'sur les flux et les sources aurait besoin de retourner un type commun, ce qui serait très artificiel et difficile à utiliser. –