Передача функций
От: Dima-Amid  
Дата: 26.03.07 17:57
Оценка:
Скажите,пожалуйста, каким образом в Java можно передавать функции в качестве параметра для функции?
Re: Передача функций
От: C0s Россия  
Дата: 26.03.07 18:02
Оценка:
Здравствуйте, Dima-Amid, Вы писали:

DA>каким образом в Java можно передавать функции в качестве параметра для функции?


интерфейсы (с точки зрения той функции, которая принимает параметр-функцию) и их анонимные реализации, вызывающие требуемую функцию (с точки зрения вызывающего кода, который знает, какую функцию надо подсунуть, и имплементирующий соотв. вызов)
Re: Передача функций
От: MAPCUAHUH  
Дата: 26.03.07 18:02
Оценка: 2 (1)
Здравствуйте, Dima-Amid, Вы писали:

DA>Скажите,пожалуйста, каким образом в Java можно передавать функции в качестве параметра для функции?


Только через интерфейс
Пример:

inteface MyFuncPtr
{
  int f(int a);
}

class F1 implements MyFuncPtr
{
   int f(int a)
   {
       return a+1;
   }
}

class F2 impements MyFuncPtr
{
   int f(int a)
   {
       return a-1;
   }
}

class Main
{
    public static void func(MyFuncPtr f,int arg)
    {
         System.out.println(f.f(arg));
    }
    public static void main(String[] args)
    {
         func(new F1(),1);
         func(new F2(),1);
    }
}
Re[2]: Передача функций
От: MAPCUAHUH  
Дата: 26.03.07 18:04
Оценка:
Здравствуйте, C0s, Вы писали:

C0s>Здравствуйте, Dima-Amid, Вы писали:


DA>>каким образом в Java можно передавать функции в качестве параметра для функции?


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


Ой про анонимные и не поумал через анонимные даже лучше
Re: Передача функций
От: bolshik Россия http://denis-zhdanov.blogspot.com/
Дата: 27.03.07 06:36
Оценка:
Здравствуйте, Dima-Amid, Вы писали:

DA>Скажите,пожалуйста, каким образом в Java можно передавать функции в качестве параметра для функции?


Как вариант использовать reflection (подход гибкий, но надо помнить, что он значительно медленнее чем прямой вызов)

public class BBB {

    public static void main(String[] args) throws Exception {
        Class clazz = Test.class;
        Method method = clazz.getMethod("first");
        new Test().second(method);
    }
}

class Test {
    public void first() {
        System.out.println("Hello from First.first()");
    }

    public void second(Method method) throws Exception {
        method.invoke(this);
    }
}
http://denis-zhdanov.blogspot.com
Re[2]: Передача функций
От: Blazkowicz Россия  
Дата: 27.03.07 07:23
Оценка:
Здравствуйте, bolshik, Вы писали:

B>Как вариант использовать reflection (подход гибкий, но надо помнить, что он значительно медленнее чем прямой вызов)


Кроме всего прочего он ещё не устойчивый к изменениям, в отличие от варианта с интерфейсами.
Re[3]: Передача функций
От: bolshik Россия http://denis-zhdanov.blogspot.com/
Дата: 27.03.07 07:36
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Кроме всего прочего он ещё не устойчивый к изменениям, в отличие от варианта с интерфейсами.


Под неустойчивым к изменениям ты имеешь ввиду отсутствие статической проверки?
http://denis-zhdanov.blogspot.com
Re[4]: Передача функций
От: Blazkowicz Россия  
Дата: 27.03.07 07:40
Оценка:
Здравствуйте, bolshik, Вы писали:

B>>Кроме всего прочего он ещё не устойчивый к изменениям, в отличие от варианта с интерфейсами.


B>Под неустойчивым к изменениям ты имеешь ввиду отсутствие статической проверки?


Да compile-time проверки кода.
Re[2]: Передача функций
От: Дмитрий В  
Дата: 27.03.07 07:40
Оценка:
Здравствуйте, bolshik, Вы писали:

B>Здравствуйте, Dima-Amid, Вы писали:


DA>>Скажите,пожалуйста, каким образом в Java можно передавать функции в качестве параметра для функции?


B>Как вариант использовать reflection (подход гибкий, но надо помнить, что он значительно медленнее чем прямой вызов)


В два раза медленнее.
Re[3]: Передача функций
От: Blazkowicz Россия  
Дата: 27.03.07 07:42
Оценка: +1
Здравствуйте, Дмитрий В, Вы писали:

B>>Как вариант использовать reflection (подход гибкий, но надо помнить, что он значительно медленнее чем прямой вызов)

ДВ>В два раза медленнее.

Не в 3, не в 10. А именно в 2?
Re[5]: Передача функций
От: bolshik Россия http://denis-zhdanov.blogspot.com/
Дата: 27.03.07 07:51
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Да compile-time проверки кода.


Ок, согласен.
http://denis-zhdanov.blogspot.com
Re: Передача функций
От: Gajdalager Украина  
Дата: 27.03.07 08:02
Оценка:
Здравствуйте, Dima-Amid, Вы писали:

DA>Скажите,пожалуйста, каким образом в Java можно передавать функции в качестве параметра для функции?

Оффтоп — существует также несколько языков, которые позволяют использовать ФВП(функции высшего порядка) и могут использоваться на JVM. Например, JRuby (реализация спецификации языка Руби на JVM), Jython (то же самое о Python), Groovy (придуман специально для JVM, динамика с опциональной статической типизацией).. Это все динамические языки, соответственно страдает перфоманс, нельзя проверить в компайл тайм функцию на предмет соответствия сигнатуры. Есть ещё Scala — все проверки во время компиляции (конечно, как и в Java можно внести элемент динамики, используя cast-ы и рефлексию), проверка сигнатуры, конструирование анонимных функций (ака лямбд) итд.
Конечно, если стоит требование использования именно языка (а не рантайма) Java, то нужно пользовать интерфейсы + анонимные реализации.
Re[3]: Передача функций
От: aka50 Россия  
Дата: 27.03.07 08:48
Оценка:
Здравствуйте, Дмитрий В, Вы писали:

ДВ>Здравствуйте, bolshik, Вы писали:


B>>Как вариант использовать reflection (подход гибкий, но надо помнить, что он значительно медленнее чем прямой вызов)


ДВ>В два раза медленнее.


ты хотел сказать на два порядка?
http://www-128.ibm.com/developerworks/library/j-dyn0603/

The logarithmic scale of the chart allows the full range of times to be displayed, but lessens the visual impact of the differences. In the case of the first two sets of figures (the Sun JVMs), the execution time using reflection is over 1000 times greater than that using direct access.

Re[4]: Передача функций
От: Дмитрий В  
Дата: 27.03.07 11:54
Оценка: -1
Здравствуйте, aka50, Вы писали:

A>Здравствуйте, Дмитрий В, Вы писали:


ДВ>>Здравствуйте, bolshik, Вы писали:


B>>>Как вариант использовать reflection (подход гибкий, но надо помнить, что он значительно медленнее чем прямой вызов)


ДВ>>В два раза медленнее.


A> ты хотел сказать на два порядка?

A>http://www-128.ibm.com/developerworks/library/j-dyn0603/

A>

A>The logarithmic scale of the chart allows the full range of times to be displayed, but lessens the visual impact of the differences. In the case of the first two sets of figures (the Sun JVMs), the execution time using reflection is over 1000 times greater than that using direct access.

На адрес статьи посмотри — 03 Jun 2003
Я сцылку на первоисточник не помню, но точно помню читал, что рефлекшн оптимизировали, и разница во времени вызова составляет два раза.
А напиши тест и проверь, раз такой любознательный
Re[5]: Передача функций
От: Дмитрий В  
Дата: 27.03.07 11:55
Оценка:
А то ведь статьям тоже не всегда верить нельзя, а тестик все на свои места расставит, вдруг я ошибаюсь?
Re[4]: Передача функций
От: Дмитрий В  
Дата: 27.03.07 11:57
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Дмитрий В, Вы писали:


B>>>Как вариант использовать reflection (подход гибкий, но надо помнить, что он значительно медленнее чем прямой вызов)

ДВ>>В два раза медленнее.

B> Не в 3, не в 10. А именно в 2?

Соглачен, удивительное совпадение, 2! — у тебя столько рук и ног, и ушей столько же, клевая цифра
Re[5]: Передача функций
От: aka50 Россия  
Дата: 27.03.07 12:38
Оценка:
Здравствуйте, Дмитрий В, Вы писали:

A>>

A>>The logarithmic scale of the chart allows the full range of times to be displayed, but lessens the visual impact of the differences. In the case of the first two sets of figures (the Sun JVMs), the execution time using reflection is over 1000 times greater than that using direct access.

ДВ>На адрес статьи посмотри — 03 Jun 2003
это не важно, за оптимизацию чего-то в оптимизированном компиляторе в 500 раз я бы нобеля сразу давал (шутка)
ДВ>Я сцылку на первоисточник не помню, но точно помню читал, что рефлекшн оптимизировали, и разница во времени вызова составляет два раза.
ДВ>А напиши тест и проверь, раз такой любознательный

Писал недавно, когда исследовал мультиметоды под жавой.... домой приду, выложу
Re[5]: Передача функций
От: Blazkowicz Россия  
Дата: 27.03.07 13:33
Оценка:
Здравствуйте, Дмитрий В, Вы писали:

ДВ> клевая цифра

Клевая-то клевая, но далекая от правды.
Re[5]: Передача функций
От: Blazkowicz Россия  
Дата: 27.03.07 13:43
Оценка: 1 (1)
Здравствуйте, Дмитрий В, Вы писали:

ДВ>Соглачен, удивительное совпадение, 2! — у тебя столько рук и ног, и ушей столько же, клевая цифра


Ты вот такой остроумный. А по делу сказать ничего не можешь.


1.5.0_09\bin\java.exe -server TestRef 999999
прямой вызов — 20
рефлексия — 1452
рефлексия2 — 80

1.5.0_09\bin\java.exe -client TestRef 999999
прямой вызов — 10
рефлексия — 1202
рефлексия2 — 1161


Никакими двумя разами даже не пахнет.


import java.lang.reflect.Method;

/**
 * This class represents...
 */
public class TestRef
{
    public static void main(String[] args) throws Exception
    {
        long l = Long.parseLong(args[0]);
        measure(new RunnableEx(){
            public void run()
            {
                doIt();
            }
        }, l);
        final Method method = TestRef.class.getDeclaredMethod("doIt", new Class[0]);
        measure(new RunnableEx(){
            public void run() throws Exception
            {
                method.invoke(null, new Object[0]);
            }
        }, l);
        measure(new RunnableEx(){
            public void run() throws Exception
            {
                method.invoke(null, new Object[0]);
            }
        }, l);
    }

    static void doIt()
    {

    }

    private static void measure(RunnableEx runnable, long iters) throws Exception
    {
        long l = System.currentTimeMillis();
        for (int i = 0; i < iters; i++)
        {
            runnable.run();
        }
        System.out.println(System.currentTimeMillis() - l);
    }

     static interface RunnableEx
    {
                void run() throws Exception;
    }
}
Re[6]: Передача функций
От: aka50 Россия  
Дата: 27.03.07 13:45
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Дмитрий В, Вы писали:


ДВ>>Соглачен, удивительное совпадение, 2! — у тебя столько рук и ног, и ушей столько же, клевая цифра


B>Ты вот такой остроумный. А по делу сказать ничего не можешь.



B>

B>1.5.0_09\bin\java.exe -server TestRef 999999
B>прямой вызов — 20
B>рефлексия — 1452
B>рефлексия2 — 80

B>1.5.0_09\bin\java.exe -client TestRef 999999
B>прямой вызов — 10
B>рефлексия — 1202
B>рефлексия2 — 1161


B>Никакими двумя разами даже не пахнет.


Да, у меня подобные цифры... только вот рефлексия2 — это с кешированием?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.