функциональное программирование на Java - PullRequest
11 голосов
/ 11 мая 2011

как вы можете эмулировать функциональное программирование в java, в частности, делать такие вещи, как отображение функции на коллекцию элементов?

map(func, new String[]{"a","b","c"});

Какой наименее многословный и неловкий способ сделать это?

Ответы [ 5 ]

10 голосов
/ 11 мая 2011

Все попытки функционального программирования будут иметь некоторую часть подробного и / или неловкого к нему в Java до Java 8.

Наиболее прямой способ заключается в предоставлении интерфейса Function (например, в этой форме Guava ) и предоставлении всех видов методов, которые принимают и вызывают его (например, Collections#transfrom()что делает то, что, как я думаю, должен делать ваш map() метод).

Недостатком является то, что вам нужно реализовать Function и часто делать это с помощью анонимного внутреннего класса, который имеет ужасно многословный синтаксис:

Collection<OutputType> result = Collections.transform(input, new Function<InputType,OutputType>() {
    public OutputType apply(InputType input) {
      return frobnicate(input);
    }
});

Лямбда-выражения (введено в Java 8) значительно упрощают (и, возможно, быстрее).Эквивалентный код с использованием лямбды выглядит так:

Collection<OutputType> result = Collections.transform(input, SomeClass::frobnicate);

или более подробный, но более гибкий:

Collection<OutputType> result = Collections.transform(input, in -> frobnicate(in));
5 голосов
/ 11 мая 2011

Я использовал lambdaj и functionsjava для такого рода вещей. И есть, вероятно, другие ...

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

Просто оберните функцию, которую вы хотите применить в списке, к классу или интерфейсу.

public interface Func {
  Object f(Object input);
}

public void map (Func func, Object[] arr) {
  for(int i=0;i<arr.legnth;i++) {
    arr[i] = func.f(arr[i]);
  }
}

map(
  new Func() { public Object f(Object input) { return input; } };,
  new String[]{"a","b"});
1 голос
/ 06 октября 2012

Вы можете загрузить OpenJDK 8, выпуск которого запланирован на следующий год, и использовать новые лямбда-выражения для функционального программирования. Смотрите http://macgyverdev.blogspot.se/2012/10/functional-programming-in-java.html для примеров того, как эти замыкания будут использоваться в API-интерфейсах Collection и как они сравниваются с решениями до Java 8, такими как Guava и LambdaJ.

1 голос
/ 11 мая 2011

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

Возьмите пример @ Иоахима.

Collection<OutputType> result = Collections.transform(input, new Function<InputType,OutputType>() {
    public OutputType apply(InputType input) {
      return frobnicate(input);
    }
});

Используется 12 символов, не считая закрывающих скобок. То же самое в простой Java будет выглядеть так.

List<OutputType> list = new ArrayList();
for(InputType in: input) 
    list.add(frobnicate(in));

Используется 7 символов.

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

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