2015-09-09 6 views
8

कभी-कभी मैं स्ट्रिंग में प्रत्येक वर्ण के साथ कुछ सरल करना चाहता हूं। दुर्भाग्यवश, क्योंकि एक स्ट्रिंग अपरिवर्तनीय है, स्ट्रिंग के माध्यम से लूपिंग को छोड़कर इसे करने का कोई अच्छा तरीका नहीं है जो काफी वर्बोज़ हो सकता है। यदि आप इसके बजाय स्ट्रीम का उपयोग करेंगे, तो इसे केवल एक पंक्ति या दो में बहुत छोटा किया जा सकता है।एक स्ट्रिंग को java.util में बदलें। स्ट्रीम <Character>

वहाँ एक रास्ता एक Stream<Character> में एक String कन्वर्ट करने के लिए है?

उत्तर

7

आप chars()CharSequence में प्रदान की विधि का उपयोग कर सकते हैं और तब से String वर्ग इस इंटरफेस को लागू करता है आप इसे उपयोग कर सकते हैं। chars() विधि एक IntStream देता है, ताकि आप (char) करने के लिए इसे कास्ट करने के लिए यदि आप Stream<Character>

को IntStream परिवर्तित करना होगा की जरूरत है जैसे

public class Foo { 

    public static void main(String[] args) { 
     String x = "new"; 

     Stream<Character> characters = x.chars().mapToObj(i -> (char) i); 
     characters.forEach(System.out::println); 
    } 
} 
+0

ध्यान दें कि यह समाधान काम नहीं करता है यदि स्ट्रिंग में यूनिकोड वर्ण होता है जो जावा चार में फिट नहीं होता है। यह मामला है, उदाहरण के लिए, कुछ आर्केन भाषाओं के साथ ही इमोटिकॉन्स के साथ। [टैगर का उत्तर] (https://stackoverflow.com/a/32472793/452775) उन समाधानों के लिए देखें जो इसे संभालते हैं। – Lii

1

आप chars तरीका है जिसके IntStream रिटर्न उपयोग कर सकते हैं और char को यह मैप करके आप Stream<Character> होगा। mapToObj रिटर्न Object हमारे मामले में Stream मूल्यवान Character की Stream, क्योंकि हम intcharCharacter करने और जावा ऑटो बॉक्स्ड इसे करने के लिए आंतरिक मैप किया गया है।

Stream<Character> stream = "abc".chars().mapToObj(c -> (char)c); 

इसके अलावा, अमरूद (com.google.common.collect.Lists) की मदद से आप इसे इस, जो String से Character के अपरिवर्तनीय सूची लौटने की तरह उपयोग कर सकते हैं।

Stream<Character> stream = Lists.charactersOf("abc").stream(); 
5

यह आमतौर पर कोड अंक जो IntStream है की धारा का उपयोग करने के लिए और अधिक सुरक्षित है:

IntStream codePoints = string.codePoints(); 

इस तरह यूनिकोड सरोगेट जोड़े, एकल कोडपॉइंट में विलय कर दिया जाएगा ताकि आप किसी भी यूनिकोड प्रतीकों के साथ सही परिणाम होगा । उदाहरण उपयोग:

String result = string.codePoints().map(Character::toUpperCase) 
     .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) 
     .toString(); 

भी ध्यान रखें कि आप मुक्केबाजी से बचने, इस प्रकार यह प्रसंस्करण Stream<Character> से भी अधिक प्रभावी हो सकता है।

StringBuilder sb = new StringBuilder(); 
String result = string.codePoints().map(Character::toUpperCase) 
         .forEachOrdered(sb::appendCodePoint); 

जबकि इस तरह के दृष्टिकोण कम कार्यात्मक लग रहा है, यह अगर आप पहले से ही एक StringBuilder है या करने के लिए बाद में कुछ और जोड़ करना चाहते हैं और अधिक कुशल हो सकता है:

एक और तरीका है इस तरह के धारा इकट्ठा करने के लिए StringBuilder अलग उपयोग करने के लिए है एक ही स्ट्रिंग

+1

प्लस वन कोड() को प्राथमिकता में कोडपॉइंट्स() का सुझाव देने के लिए। –

संबंधित मुद्दे