इस तरह के कार्यों से निपटने के लिए एक भी एक में कई लेनेवालों के परिणाम गठबंधन करने के लिए किया जाएगा सबसे सामान्य तरीके से।
jOOL लाइब्रेरी का उपयोग करना, आप निम्न हो सकता है:
Content content =
Seq.seq(contentList)
.collect(
Collectors.mapping(Content::getA, Collectors.joining(", ")),
Collectors.mapping(Content::getB, Collectors.joining(", ")),
Collectors.mapping(Content::getC, Collectors.joining(", "))
).map(Content::new);
इस इनपुट सूची में से एक Seq
बनाता है और एक Tuple3
बनाने के लिए, जो केवल 3 मूल्यों के लिए एक धारक है 3 दिए गए कलेक्टरों को जोड़ती है। उन 3 मानों को तब Content
में कन्स्ट्रक्टर new Content(a, b, c)
का उपयोग करके मैप किया जाता है। कलेक्टर खुद को बस अपने a
, b
या c
मूल्य में प्रत्येक Content
मानचित्रण और एक साथ एक ", "
द्वारा अलग-अलग परिणाम शामिल हो रहे हैं।
तीसरे पक्ष के मदद के बिना, हम इस तरह हमारे अपने combiner कलेक्टर बना सकते हैं (इस StreamExpairing
कलेक्टर, जो 2 कलेक्टरों के लिए एक ही बात करता है के आधार पर किया जाता है)। यह 3 कलेक्टरों को तर्क के रूप में लेता है और 3 एकत्रित मूल्यों के परिणामस्वरूप एक फिनिशर ऑपरेशन करता है।
public interface TriFunction<T, U, V, R> {
R apply(T t, U u, V v);
}
public static <T, A1, A2, A3, R1, R2, R3, R> Collector<T, ?, R> combining(Collector<? super T, A1, R1> c1, Collector<? super T, A2, R2> c2, Collector<? super T, A3, R3> c3, TriFunction<? super R1, ? super R2, ? super R3, ? extends R> finisher) {
final class Box<A, B, C> {
A a; B b; C c;
Box(A a, B b, C c) {
this.a = a;
this.b = b;
this.c = c;
}
}
EnumSet<Characteristics> c = EnumSet.noneOf(Characteristics.class);
c.addAll(c1.characteristics());
c.retainAll(c2.characteristics());
c.retainAll(c3.characteristics());
c.remove(Characteristics.IDENTITY_FINISH);
return Collector.of(
() -> new Box<>(c1.supplier().get(), c2.supplier().get(), c3.supplier().get()),
(acc, v) -> {
c1.accumulator().accept(acc.a, v);
c2.accumulator().accept(acc.b, v);
c3.accumulator().accept(acc.c, v);
},
(acc1, acc2) -> {
acc1.a = c1.combiner().apply(acc1.a, acc2.a);
acc1.b = c2.combiner().apply(acc1.b, acc2.b);
acc1.c = c3.combiner().apply(acc1.c, acc2.c);
return acc1;
},
acc -> finisher.apply(c1.finisher().apply(acc.a), c2.finisher().apply(acc.b), c3.finisher().apply(acc.c)),
c.toArray(new Characteristics[c.size()])
);
}
और अंत के साथ
Content content = contentList.stream().collect(combining(
Collectors.mapping(Content::getA, Collectors.joining(", ")),
Collectors.mapping(Content::getB, Collectors.joining(", ")),
Collectors.mapping(Content::getC, Collectors.joining(", ")),
Content::new
));
अच्छा समस्या वर्णन में उपयोग करें। लेकिन अब, आपने क्या प्रयास किया है? StackOverflow अन्य लोगों को आपके लिए कोड लिखने के लिए एक समुदाय नहीं है। इसके बजाय, आपको एक [mcve] पोस्ट करने की ज़रूरत है जो आपने कोशिश की थी, जो मिला, और जो आपने अपेक्षित था, और स्टैक ओवरफ्लो समुदाय यह निर्धारित करने में मदद कर सकता है कि आप कहां गलत हो गए हैं और समाधान बताते हैं। सुझाव के लिए – AJNeufeld
@AJNeufeld धन्यवाद। यह पहली बार है कि मैं एसओ पर एक प्रश्न पोस्ट करने की कोशिश कर रहा हूं हालांकि इसे हर दिन इस्तेमाल करते हैं। मैं सामग्री को जोड़ने के लिए एक चर के साथ लूप के लिए बुनियादी के साथ काम कर रहा हूँ। और मैंने स्ट्रीम पर प्रत्येक के लिए उपयोग करने का प्रयास किया, फिर एहसास हुआ कि जावा अज्ञात फ़ंक्शन फ़ोरैच ब्लॉक के अंदर परिवर्तनीय संशोधित करने की अनुमति नहीं देते हैं। इसके अलावा मैंने एक पहुंच के लिए एक संग्रह लिखने पर विचार किया लेकिन महसूस किया कि यह या तो कुशल नहीं होगा। – Vedanth