استخدام المجمع على تيار بدائي
-
21-12-2019 - |
سؤال
هل هناك أي طريقة للاستخدام في Java 8 تيار::جمع (جامع) على تيارات بدائية؟
عادة أ Stream<Integer>
على سبيل المثال هناك طريقتان للتجميع:
<R,A> R collect(Collector<? super T,A,R> collector)
<R> R collect(Supplier<R> supplier, BiConsumer<R,? super T> accumulator, BiConsumer<R,R> combiner)
لكن IntStream
لديه طريقة واحدة فقط لجمع:
الآن كمثال على التعليمات البرمجية لدي ما يلي:
@Override
public void run() {
result = LongStream.range(1, maximum).boxed()
.collect(Collectors.toMap(i -> i, i -> (int)Iterators.longStream(new CollatzGenerator(i)).count()))
.entrySet().stream()
.max(Comparator.comparingLong(Map.Entry::getValue))
.get().getKey();
}
كما ترون، قمت أولاً بوضع المربعات الأولية حتى أتمكن من استخدام ملف Collectors.
طريقة.
هل هناك أي طريقة يمكنني من خلالها استخدام البدائيات ولا يزال لدي نفس الرمز معها Collectors.toMap
?
المحلول
منذ Map
هي واجهة عامة ولا توجد طريقة لإنشاء ملف Map
بدون ملاكمة.ومع ذلك، ليس من المنطقي جمع العناصر في ملف Map
على الإطلاق عندما يكون كل ما تريده هو إنشاء دفق آخر (مع قيمتين فقط ملفوفتين في ملف Map.Entry
).يمكنك فقط إنشاء Map.Entry
الحالات دون جمع القيم:
LongStream.range(1, maximum)
.mapToObj(i->new AbstractMap.SimpleEntry<>(i, Iterators.longStream(new CollatzGenerator(i)).count()))
.max(Comparator.comparingLong(Map.Entry::getValue))
.get().getKey();
لا يزال هذا يقوم بالملاكمة التلقائية ولكن بمجرد وصولك إلى هذه المرحلة، يمكنك التخلص من Map.Entry
أيضًا عن طريق إنشاء فئة حامل القيمة المناسبة بنفسك:
static final class TwoLongs {
final long key, value;
TwoLongs(long k, long v) { key=k; value=v; }
public long getKey() { return key; }
public long getValue() { return value; }
}
باستخدام فئة الحامل هذه، يمكنك معالجة بياناتك دون الحاجة إلى ملاكمة الملف long
س:
LongStream.range(1, maximum)
.mapToObj(i->new TwoLongs(i, Iterators.longStream(new CollatzGenerator(i)).count()))
.max(Comparator.comparingLong(TwoLongs::getValue))
.get().getKey();
حسنًا، لا يزال الأمر نوعًا من الملاكمة ولكن إنشاء عنصر واحد ( TwoLongs
مثيل) كائن بدلاً من ثلاثة (واحد Map.Entry
و اثنان Long
س).
نصائح أخرى
long result = LongStream.range(0, 9)
.mapToObj(i -> new long[]{i, i})
.max(Comparator.comparingLong(pair -> pair[1]))
.get()[0];