2010-10-28 8 views
6

मैं कुछ मौजूदा जावा कोड में लिफ़्ट एप्लिकेशन को एकीकृत करने की कोशिश कर रहा हूं। मेरे स्निपेट में से एक में, मेरे पास जावा ऑब्जेक्ट्स का ऐरे है जिसे मुझे इसे नोडसेक में मैप करने की आवश्यकता है। मैं नोड के एक ऐरे प्राप्त कर सकता हूं, लेकिन नोडसेक नहीं। (कम से कम, बहुत कार्यात्मक दिखने वाले तरीके में नहीं)।मैं ऐरे [नोड] को नोडसेक में कैसे परिवर्तित करूं?

import scala.xml.NodeSeq 

// pretend this is code I can't do anything about 
val data = Array("one", "two", "three") 

// this is the function I need to write 
def foo: NodeSeq = data.map { s => <x>{s}</x> } 
//      ^
// error: type mismatch; 
// found : Array[scala.xml.Elem] 
// required: scala.xml.NodeSeq 

ऐसा करने का सबसे साफ तरीका क्या है?

+1

आपके पास हमेशा '++' विधि उपलब्ध है :-) 'नया नोडसेक() ++ theArray_Elm_thing'। बेहतर तरीके हो सकते हैं। हैप्पी कोडिंग –

+1

नोडसेक सार है, इसलिए 'नया नोडसेक()' काम नहीं करता है। –

उत्तर

8

मैं बस अनुक्रम को map उत्पादन में बदल सकते हैं (यह देखते हुए कि Seq[Node]NodeSeq की एक सुपर वर्ग है)

scala> def foo: NodeSeq = data.map { s => <x>{s}</x> } toSeq 
foo: scala.xml.NodeSeq 

या foldLeft का उपयोग करने के बजाय map

scala> def foo: NodeSeq = (Seq[Node]() /: data) {(seq, node)=> seq ++ <x>{node}</x>} 
foo: scala.xml.NodeSeq 
+1

toSeq वह लालित्य है जिसे मैं ढूंढ रहा हूं। धन्यवाद! – leedm777

+0

मानचित्र का उपयोग करना और फिर सेक का मतलब है कि आप 2 संग्रह बना रहे हैं। ब्रेक का उपयोग करना आप बना रहे हैं 1. – IttayD

+2

'toSeq' एक रैपर बनाता है (http://www.scala-lang.org/api/current/scala/collection/mutable/WrappedArray.html), इसलिए एक दुखी प्रदर्शन दंड है। http://www.scala-lang.org/docu/files/collections-api/collections_38.html –

9
scala> import collection.breakOut 
import collection.breakOut 

scala> def foo: NodeSeq = data.map { s => <x>{s}</x> }(breakOut) 
foo: scala.xml.NodeSeq 

विधि मानचित्र में वास्तव में दो तर्क सूचियां हैं। पहला एक समारोह स्वीकार करता है, जिसे आपने पास किया था। दूसरा एक CanBuildFrom ऑब्जेक्ट स्वीकार करता है जिसका उपयोग एक निर्माता बनाने के लिए किया जाता है जो तब रिटर्निंग अनुक्रम बनाता है। यह तर्क निहित है, इसलिए आम तौर पर संकलक इसे आपके लिए भर देता है। यह 3 प्रकार के पैरामीटर स्वीकार करता है: से, टी, टू। कई पूर्वनिर्धारित implicits (वस्तु नोडसेक सहित) हैं, लेकिन उनमें से कोई भी = Array, टी = नोड, करने के लिए = NodeSeq से मेल खाता है।

ब्रेकऑट यह हल करता है: यह एक सामान्य तरीका है जो एक अंतर्निहित CanBuildFrom [कुछ भी नहीं, टी] करने के लिए खोज कर CanBuildFrom उदाहरण देता है। निहित खोज नियमों के मुताबिक, किसी भी CanBuildFrom से मेल खाता है, से और उसके पास है> कुछ भी स्वीकार्य नहीं है। इस मामले में: वस्तु सरणी में canBuildFrom

+2

ब्रेक से लिंक करना उचित लग रहा था। प्रश्न: http://stackoverflow.com/questions/1715681/scala-2-8-breakout –

1

आप इस विधि को नोडसेक साथी ऑब्जेक्ट पर देख रहे हैं।

NodeSeq.fromSeq(s: Seq[Node])