2016-01-15 12 views
17

जावा 8 में दो Stream उदाहरणों की तुलना करने का एक अच्छा तरीका क्या होगा और पता लगाएं कि उनके पास समान तत्व हैं, खासकर यूनिट परीक्षण के प्रयोजनों के लिए?जावा में दो स्ट्रीम की तुलना कैसे करें 8

क्या मैं अब मिल गया है है:

@Test 
void testSomething() { 
    Stream<Integer> expected; 
    Stream<Integer> thingUnderTest; 
    // (...) 
    Assert.assertArrayEquals(expected.toArray(), thingUnderTest.toArray()); 
} 

या वैकल्पिक रूप से:

Assert.assertEquals(
    expected.collect(Collectors.toList()), 
    thingUnderTest.collect(Collectors.toList())); 

लेकिन इसका मतलब है कि मैं दो संग्रह का निर्माण कर रहा हूँ और उन्हें त्यागकर। यह मेरी टेस्ट स्ट्रीम के आकार को देखते हुए एक प्रदर्शन मुद्दा नहीं है, लेकिन मैं सोच रहा हूं कि दो धाराओं की तुलना करने के लिए एक कैननिकल तरीका है या नहीं।

+0

मैं बहुत यकीन है कि वहाँ एक संग्रह या सरणी के रूप में आप ऊपर किया है में धाराओं मजबूर बिना कोई रास्ता नहीं है हूँ। – joecoder

+5

प्रत्येक को 'इटरेटर()' के लिए पूछें, और लॉकस्टेप में उन्हें पार करें। –

+6

बीटीडब्ल्यू, यह स्ट्रीम के लिए परीक्षण ढांचे में आता है। हमने 18 ट्रैवर्सल मोड निर्दिष्ट किए हैं (और भी हैं, ये वे हैं जिन्हें हमने परीक्षण किया है) और "समान" धारा को सभी तरीकों से पार करते हैं, और तुलना करें कि परिणाम समान हैं (स्ट्रीम लाइब्रेरी अर्थशास्त्र द्वारा अनुमत मॉड्यूलो रीडरिंग्स।) उदाहरण के लिए देखें , http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/test/java/util/stream/bootlib/java/util/stream/StreamTestScenario.java। –

उत्तर

17
static void assertStreamEquals(Stream<?> s1, Stream<?> s2) 
{ 
    Iterator<?> iter1 = s1.iterator(), iter2 = s2.iterator(); 
    while(iter1.hasNext() && iter2.hasNext()) 
     assertEquals(iter1.next(), iter2.next()); 
    assert !iter1.hasNext() && !iter2.hasNext(); 
} 
+0

मुझे लगता है कि आप 'इंटस्ट्रीम', 'लॉन्गस्ट्रीम' और 'डबलस्ट्रीम' का समर्थन करने के लिए 'बेसस्ट्रीम एस 1, बेसस्ट्रीम एस 2' का उपयोग कर सकते हैं। –

+0

@TagirValeev - अच्छा विचार। और प्रदर्शन-जुनून के लिए, उन्हें 'assertStreamEquals (IntStream, IntStream) 'अधिभारित करना चाहिए। – ZhongYu

4

परीक्षण के तहत धारा एकत्रित करना (जैसा कि आप दिखाते हैं) परीक्षण करने का एक सीधा और प्रभावी तरीका है। आप अपेक्षित परिणामों की सूची उपलब्ध सबसे आसान तरीके से बना सकते हैं, जो संभवतः स्ट्रीम एकत्र नहीं कर सकता है।

वैकल्पिक रूप से, नकली सहयोगी बनाने के लिए अधिकांश पुस्तकालयों के साथ, कोई Consumer पर नकल कर सकता है जो विशेष तत्वों के साथ accept() कॉल की "अपेक्षा" करता है। ConsumeStream इसके साथ, और उसके बाद "सत्यापित करें" कि इसकी कॉन्फ़िगर की गई अपेक्षाएं पूरी की गईं।

1
public static boolean equalStreams(Stream<?>...streams) { 
    List<Iterator<?>>is = Arrays.stream(streams).map(Stream::iterator).collect(Collectors.toList()); 
    while(is.stream().allMatch(Iterator::hasNext)) 
     if(is.stream().map(Iterator::next).distinct().limit(2).count()>1) return false; 
    return is.stream().noneMatch(Iterator::hasNext); 
} 
संबंधित मुद्दे