Поддерживает ли Java карринг? - PullRequest
85 голосов
/ 26 мая 2011

Мне было интересно, есть ли способ вытащить это на Java.Я думаю, что это невозможно без встроенной поддержки замыканий.

Ответы [ 15 ]

3 голосов
/ 26 мая 2011

Каррирование метода всегда возможно в Java, но оно не поддерживает его стандартным способом. Попытка достичь этого сложна и делает код довольно нечитаемым. Java не подходит для этого.

2 голосов
/ 25 марта 2018

Это библиотека для карри и частичного применения в Java:

https://github.com/Ahmed-Adel-Ismail/J-Curry

Он также поддерживает деструктуризацию Tuples и Map.Entry по параметрам метода, например, передавая Map.Entry методу, который принимает 2 параметра, поэтому Entry.getKey () перейдет к первому параметру и Entry. getValue () будет идти для второго параметра

Подробнее в файле README

2 голосов
/ 26 мая 2011

Хотя вы можете делать Curry в Java, это уродливо (потому что это не поддерживается) В Java проще и быстрее использовать простые циклы и простые выражения. Если вы опубликуете пример использования карри, мы можем предложить альтернативы, которые делают то же самое.

1 голос
/ 14 октября 2018

Преимущество использования Curry в Java 8 состоит в том, что он позволяет вам определять функции высокого порядка, а затем передавать функцию первого порядка и аргументы функции в элегантной цепочке.

Вот пример для исчисления, производной функции.

  1. Позволяет определить приближение производной функции как (f (x + h) -f (x)) /ч .Это будет функция старшего порядка
  2. Давайте вычислим производную 2-х различных функций 1 / x и стандартизированного гауссова распределения

1

    package math;

    import static java.lang.Math.*;
    import java.util.Optional;
    import java.util.function.*;

    public class UnivarDerivative
    {
      interface Approximation extends Function<Function<Double,Double>, 
      Function<Double,UnaryOperator<Double>>> {}
      public static void main(String[] args)
      {
        Approximation derivative = f->h->x->(f.apply(x+h)-f.apply(x))/h;
        double h=0.00001f;
        Optional<Double> d1=Optional.of(derivative.apply(x->1/x).apply(h).apply(1.0)); 
        Optional<Double> d2=Optional.of(
        derivative.apply(x->(1/sqrt(2*PI))*exp(-0.5*pow(x,2))).apply(h).apply(-0.00001));
        d1.ifPresent(System.out::println); //prints -0.9999900000988401
        d2.ifPresent(System.out::println); //prints 1.994710003159016E-6
      }
    }
0 голосов
/ 22 января 2019

Да, я согласен с @ Jérôme, curring в Java 8 не поддерживается стандартным способом, как в Scala или других функциональных языках программирования.

public final class Currying {
  private static final Function<String, Consumer<String>> MAILER = (String ipAddress) -> (String message) -> {
    System.out.println(message + ":" + ipAddress );
  };
  //Currying
  private static final Consumer<String> LOCAL_MAILER =  MAILER.apply("127.0.0.1");

  public static void main(String[] args) {
      MAILER.apply("127.1.1.2").accept("Hello !!!!");
      LOCAL_MAILER.accept("Hello");
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...