Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to do function composition?

Tags:

java

java-8

While rather impatiently waiting for Java 8 release and after reading brilliant 'State of the Lambda' article from Brian Goetz I noticed that function composition was not covered at all.

As per above article, in Java 8 the following should be possible:

// having classes Address and Person public class Address {      private String country;      public String getCountry() {         return country;     } }  public class Person {      private Address address;      public Address getAddress() {         return address;     } }  // we should be able to reference their methods like Function<Person, Address> personToAddress = Person::getAddress; Function<Address, String> addressToCountry = Address::getCountry; 

Now if I would like to compose these two functions to have a function mapping Person to country, how can I achieve this in Java 8?

like image 454
Yuriy Nakonechnyy Avatar asked Nov 07 '13 11:11

Yuriy Nakonechnyy


People also ask

How are functions composed?

In mathematics, function composition is an operation ∘ that takes two functions f and g, and produces a function h = g ∘ f such that h(x) = g(f(x)). In this operation, the function g is applied to the result of applying the function f to x.


2 Answers

There are default interface functions Function::andThen and Function::compose:

Function<Person, String> toCountry = personToAddress.andThen(addressToCountry); 
like image 169
Andrey Chaschev Avatar answered Oct 05 '22 08:10

Andrey Chaschev


There is one flaw in using compose and andThen. You have to have explicit variables, so you can't use method references like this:

(Person::getAddress).andThen(Address::getCountry) 

It won't be compiled. What a pity!

But you can define an utility function and use it happily:

public static <A, B, C> Function<A, C> compose(Function<A, B> f1, Function<B, C> f2) {         return f1.andThen(f2);     }  compose(Person::getAddress, Address::getCountry) 
like image 41
Mikhail Golubtsov Avatar answered Oct 05 '22 08:10

Mikhail Golubtsov