Аргументы функции гуавы - PullRequest
       4

Аргументы функции гуавы

9 голосов
/ 28 октября 2010

Очевидно, что следующее работает, но я не люблю оборачивать элементы в Tuple,

    ImmutableMap<String, Function<Tuple2<Double>, Double>> op = new //
    ImmutableMap.Builder<String, Function<Tuple2<Double>, Double>>()
            .put("+", new Function<Tuple2<Double>, Double>() {
                @Override public Double apply(Tuple2<Double> data) {
                    return data.Val_1 + data.Val_2;
                }
            }).build();
    System.out.println(op.get("+").apply(new Tuple2<Double>(3d, 4d)));

Я хочу написать что-то вроде:

    ImmutableMap<String, Function<Double[], Double>> op = new //
    ImmutableMap.Builder<String, Function<Double[], Double>>()
            .put("+", new Function<Double[], Double>() {
                @Override
                public Double apply(Double... data) {
                    return data[0] + data[1];
                }
            }).build();
    System.out.println(op.get("+").apply(3d, 4d));

Помощь будет наиболее полезной, ты.

Редактировать: Проблема решена, началось использование:

public interface T2Function<T> {
    T apply(T Val_1, T Val_2);
}

Ответы [ 2 ]

15 голосов
/ 28 октября 2010

Я думаю, вам лучше использовать собственный интерфейс, примерно такой:

public interface Operation {
  double apply(double a, double b);
}

Guava's Function - это функция с одним аргументом и не подходит для чего-либо с несколькими аргументами.

Еще одна вещь, с которой я экспериментировал, это ReduceFunction<F, T>, которая может быть использована для такой вещи. Он предназначен для использования с операцией reduce или fold и выглядит примерно так:

public interface ReduceFunction<F, T> {
  T apply(T a, F b); // I can't decide on good names for the parameters =(
}

Это позволяет вам делать такие вещи, как

List<Double> doubles = ...
Double sum = reduce(doubles, MathOps.add(), 0.0);

, где MathOps.add() - это ReduceFunction<Double, Double>, который делает очевидную вещь.

3 голосов
/ 03 ноября 2010

Похоже, что вы после эквивалента c # Func : Специализируется в вашем случае с аргументами и возвращаемым значением того же типа.

Есть еще два вопроса с хорошими ответами по этому поводу.

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

См. Смешение объектно-ориентированного и функционального программирования для более интересного обсуждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...