Learning to write functional programming with Java 8 with examples -- part 2
In the last post I created custom functional interfaces to explain functional programming, closure, and lambda expressions in Java 8. This post gives Java 8 API examples using lambda expressions and functional programming.
Example 1: The java.lang.Runnable interface has been made a functional interface.
package com.java8.examples;
public class Example1 {
public static void main(String[] args) {
System.out.println("main thread: " + Thread.currentThread().getName());
//run method takes no arguments so: () -> (body)
//closure worker thread1
Runnable r = () -> (System.out.println("worker thread: " + Thread.currentThread().getName()));
new Thread(r).start(); //pass the Runnable closure to Thread constructor
//closure worker thread2
new Thread( () -> (System.out.println("worker thread: " + Thread.currentThread().getName()))).start();
}
}
Output:
main thread: main
worker thread: Thread-0
worker thread: Thread-1
Example 2: The java.util.function package has a number of functional interfaces.
package com.java8.examples;
import java.util.function.Consumer;
public class Example2 {
public static void main(String[] args) {
//closure of Consumer 1. the accept(T t) method takes Integer here
Consumer<Integer> c1 = (x) -> {System.out.println("consumed: " + x);};
//closure of Consumer 2. x is an Integer
Consumer<Integer> c2 = (x) -> {System.out.println("consumed: " + x*x);};
c1.accept(5);
c2.accept(5);
//andThen is a default method implementation in Consumer interface
Consumer<Integer> c3 = c1.andThen(c2);
c3.accept(6);
}
}
Output:consumed: 5
consumed: 25
consumed: 6
consumed: 36
Example 3: The Function<T, R> is similar to Consumer<T>, but the Function interface has a return value in its apply(T t) method, whereas the Consumer has a void method accept(T t).
package com.java8.examples;
import java.util.function.Function;
public class Example3 {
public static void main(String[] args) {
//closure of Function. apply(T t) method takes Double here
Function<Double, Double> c1 = (arg) -> (arg + arg);
Function<Double, Double> c2 = (arg) -> (arg * arg);
Double result1 = c1.apply(5.0);
Double result2 = c2.apply(5.0);
System.out.println("result1= " + result1);
System.out.println("result2= " + result2);
//andThen is a default method implementation in Function interface
Function<Double, Double> c3 = c1.andThen(c2);
Double result3 = c3.apply(6.0);
System.out.println("result3= " + result3);// 6 + 6 = 12, 12 * 12 = 144;
}
}
Output:
result1= 10.0
result2= 25.0
result3= 144.0
Example 4: The Predicate<T> interface from java.util.function package has test(T t) method that returns a boolean value indicating test condition has passed or failed. The predicates are often used to filter a collection of objects.
package com.java8.examples;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class Example4 {
private static final int SHORT_NAME_LENGTH = 3;
public static void main(String[] args) {
List<String> languages = Arrays.asList("Java", "C++", "PHP", "C#", "Scala", "JRuby", "Jython");
//The Predicate interface has test(T t) that returns a boolean
Predicate<String> shortNamePredicate = (s) -> (s.length() <= SHORT_NAME_LENGTH); // closure
Predicate<String> startsWithCPredicate = (s) -> (s.startsWith("J")); //closure
languages.stream()
.filter(shortNamePredicate)
.forEach(e -> System.out.println("short names: " + e));
languages.stream()
.filter(startsWithCPredicate)
.forEach(e -> System.out.println("starts with J: " + e));
}
}
Output:
short names: C++
short names: PHP
short names: C#
starts with J: Java
starts with J: JRuby
starts with J: Jython
There are more examples relating working with Java collection -> Understanding Java 8 Streams and working with collections using Lambda expressions
Labels: Java 8, Java Lambda expressions

0 Comments:
Post a Comment
Subscribe to Post Comments [Atom]
<< Home