سؤال

أحاول تنفيذ تسلسل كسول (وهذا يعني أن العنصر التالي يتم حسابه فقط عند استدعاء وظيفة الخطوة) ، وأحد الطرق التي ينبغي أن يكون لها "خريطة" التي تتلقى وظيفة تؤثر على جميع الأعضاء. الطريقة الأكثر أناقة للقيام بذلك هي استخدام تكوين الوظيفة ، وتعيين الوظيفة الجديدة لمتغير الوظيفة ، ولكن نظرًا لأن الوظائف ليست قيم الدرجة الأولى في Java ليس لدي أي فكرة عن كيفية القيام بذلك.

فكرت في امتلاك فصل دراسي يحتوي فقط على وظيفة ، كنوع من غلاف "مؤشر الوظيفة" ، لكنني لا أرى كيف يمكن استخدام ذلك للتكوين.

تحرير: السؤال هو الواجب المنزلي. أيضًا ، يجب أن يكون قادرًا على التعامل مع التراكيب المتعددة على خطوط الخريطة (MAP (MAP (StepFunction ())))) ("MAP" في هذه الحالة هي الوظيفة المعطاة من خلال الطريقة "MAP").

هل كانت مفيدة؟

المحلول

مرحبا بكم في جافا وآلامها.

interface Function<T> {
    public T eval(T argument);
}

class Lazy<T> {
    private Iterator<T> source;
    private Function<T> filter;
    Lazy(final Iterator<t> source, final Function<T> filter) {
        this.source = source;
        this.filter = filter;
    }
    public T step() {
        return filter.eval(source.next());
    }
}

نصائح أخرى

مجموعات جوجل لديه Function اكتب ال Functions.compose(Function, Function) الطريقة ، Iterables.transform(Iterable, Function) الطريقة ، وأكثر من ذلك بكثير.

ليس مفيدًا لك إذا كان هذا هو الواجب المنزلي (أتمنى حقًا أن يكشف الجميع عندما يكون سؤالهم مرتبطًا بالواجب المنزلي).

في جافا ، تقوم دائمًا بذلك مع بروتوكول الفصل. يرى java.lang.Thread ووظيفة التشغيل للمثال الكنسي. لا توجد "مؤشرات وظيفة" أو "متغيرات الوظائف" في Java.

FWIW ، "مؤشر الوظيفة" المكافئ في Java هو واجهه المستخدم مع طريقة واحدة. تقوم بتنفيذ الواجهة مع بعض الفصول ، والتي توفر تنفيذ الطريقة ، ثم تخزين إشارة إلى كائن الفئة هذا.

إن تغيير الإشارة إلى كائن فئة آخر ، والذي ينفذ الطريقة بشكل مختلف ، يعادل تغيير مؤشر الوظيفة للإشارة إلى وظيفة مختلفة.

public static <T> void apply(final List<T> list, final Function<T> func)
{
    for(final T val : list)
    {
        func.perform(val);
    }
}

interface Function<T>
{
    void apply(T value);
}

class DisplayFunction<T>
    implements Function<T>
{
    public void perform(T value)
    {
        System.out.println(value);
    }
}

تطبيق المكالمة (القائمة ، العرض الجديد Function ()) ؛

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top