سؤال

هل هناك أي طريقة للاستخدام في Java 8 تيار::جمع (جامع) على تيارات بدائية؟

عادة أ Stream<Integer> على سبيل المثال هناك طريقتان للتجميع:

لكن 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];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top