Функциональные указатели/делегаты в Java?

Нам нужно увеличить способ оплаты вместо массива слияния, чтобы предотвратить перезапись старого значения. Ниже код работает для меня

<?php
$shipment = [
    [
        'Datum' => '2016-07-07',
        'C' => 1,
    ],
    [
        'Datum' => '2016-07-07',
        'C' => 1,
    ],
    [
        'Datum' => '2016-07-07',
        'Paypal' => 1,
    ],
    [
        'Datum' => '2016-07-07',
        'Bank' => 1,
    ],
    [
        'Datum' => '2016-07-12',
        'Bank' => 1,
    ],
];

$template = ['C' => 0, 'Afterpay' => 0, 'Paypal' => 0, 'Bank' => 0, 'Ideal' => 0];
$result = [];

array_walk($shipment, function ($v) use (&$result, $template) {
    // Init by Datum if it is not in array
    $date = $v['Datum'];
    if (!isset($result[$date])) {
        $result[$date] = $template;
    }

    // Unset Datum to get final payment method only
    unset($v['Datum']);
    $itemKey = array_keys($v)[0];

    // Increase number
    $result[$date][$itemKey] += $v[$itemKey];
});

// Dump result
var_dump($result);
13
задан Peter O. 15 January 2013 в 06:00
поделиться

6 ответов

Что относительно этого?

HashMap<Integer, Runnable> map = new HashMap<Integer, Runnable>();
map.put(Register.ID, new Runnable() { 
    public void run() { functionA(); }
});
map.put(NotifyMessage.ID, new Runnable() { 
    public void run() { functionB(); }
});
// ...
map.get(id).run();

(Если необходимо передать некоторые аргументы, определите собственный интерфейс с функцией, имеющей подходящий параметр и использование это вместо Выполнимого).

22
ответ дан 1 December 2019 в 20:44
поделиться

Java действительно не имеет указателей функции (мы получили анонимные внутренние классы вместо этого). Нет действительно ничего неправильно с использованием переключателя, тем не менее, пока Вы включаете значение а не на типе. Есть ли некоторая причина, Вы не хотите использовать переключатель? Кажется, что необходимо будет сделать отображение между идентификаторами Действия и действия где-нибудь в коде, итак, почему бы не сохранить это простым?

2
ответ дан 1 December 2019 в 20:44
поделиться

Java не имеет первоклассных указателей функции. Для достижения схожей функциональности необходимо определить и реализовать интерфейс. Можно помочь с помощью анонимных внутренних классов, но это все еще не очень симпатично. Вот пример:

public interface PacketProcessor
{
    public void processPacket(Packet packet);
}

...

PacketProcessor doThing1 = new PacketProcessor()
{
    public void processPacket(Packet packet)
    {
        // do thing 1
    }
};
// etc.

// Now doThing1, doThing2 can be used like function pointers for a function taking a
// Packet and returning void
1
ответ дан 1 December 2019 в 20:44
поделиться

Вы когда-либо использовали Swing/AWT? Их иерархия События решает подобную проблему. Путем Java раздает функции, с интерфейсом, например

public interface ActionHandler {
    public void actionPerformed(ActionArgs e);
}

Затем если Вы хотите отобразить целые числа на эти объекты, Вы могли бы использовать что-то как a java.util.HashMap<Integer,ActionHandler> управлять этим. Фактическая реализация может или войти в анонимные классы (наилучшее приближение Java "лямбды") или в надлежащих классах где-нибудь. Вот является анонимный класс путем:

HashMap<Integer,ActionHandler> handlers;
handlers.put(ACTION_FROB, new ActionHandler() {
    public void actionPerformed(ActionArgs e) {
        // Do stuff
        // Note that any outer variables you intend to close over must be final.
    }
});
handlers.get(ACTION_FROB).actionPerformed(foo);

(редактирование), Если Вы хотите быть еще более оскорбительными, можно инициализировать HashMap как так:

HashMap<Integer,String> m = new HashMap<Integer,String>() {{
    put(0,"hello");
    put(1,"world");
}};
1
ответ дан 1 December 2019 в 20:44
поделиться

Можно сделать это с помощью цепочки шаблона ответственности.

Это - шаблон, который связывает различные объекты с вместе отчасти как связанный список. т.е. Каждый объект имеет ссылку на затем в цепочке. Объекты в цепочке обычно обрабатывают одно определенное поведение. Поток между объектами очень похож на оператора case оператора switch.

Существуют некоторые глюки, такой как, это распространяет Вашу логику, чрезмерно длинная цепочка может вызвать проблемы производительности. Но наряду с этими глюками Вы обладаете преимуществом увеличенной тестируемости и более сильным сцеплением. Также Вы не ограничены перечислением использования, байтом, международные короткие, и символьные выражения как триггер для ветвления.

0
ответ дан 1 December 2019 в 20:44
поделиться

Проверьте замыкания, как они реализованы в библиотеке lambdaj. На самом деле их поведение очень похоже на поведение делегатов C #:

http://code.google.com/p/lambdaj/wiki/Closures

0
ответ дан 1 December 2019 в 20:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: