Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Productive
Programming
in Java 8
Covering Lambdas and Streams
ocpjava.wordpress.com
Ganesh Samarthyam (ganesh.samarthyam@g...
❖ Programming examples are
from our book:
❖ Oracle Certified
Professional Java SE 8
Programmer Exam 1Z0-809:
A Comprehensiv...
Java
876
…
I am evolving…
Java 8: Latest (red-hot)
Recent addition:
lambdas
8
Greek characters
are scary!
He he, but lambdas
are fun, not scary
Java meets functional
programming (with lambdas)
How different is lambdas?
if
while
for
switch
Introducing our star
feature - lambda
functions
List<String> strings = Arrays.asList("eeny", "meeny", "miny", "mo");
Consumer<String> printString = string -> System.out.p...
But what are
lambdas?
Lambdas is just a fancy
name for functions
without a name!
What are lambdas?
❖ (Java 8) One way to think about lambdas is
“anonymous function” or “unnamed function” - they
are funct...
Arrays.asList("eeny", "meeny", "miny", “mo”)
.forEach(string -> System.out.println(string));
Internal Iteration
List<Strin...
You can use lambdas for
some amazing stuff
sediment
pre-
carbon
ultra-filter
post-
carbon
Filtered
water
E.g., you can compose lambda
functions as in pipes-and-filters
$ cat limerick.txt
There was a young lady of Niger
Who smiled as she rode on a tiger.
They returned from the ride
With the...
$ cat limerick.txt | tr -cs "[:alpha:]" "n" | awk '{print
length(), $0}' | sort | uniq
1 a
2 as
2 of
2 on
3 And
3 Who
3 sh...
List<String> lines
= Files.readAllLines(Paths.get("./limerick.txt"), Charset.defaultCharset());
	 	 Map<Integer, List<Stri...
Lambdas & streams help in
productive programming!
public static void main(String []file) throws Exception {
// process each file passed as argument
// try opening the file ...
So, lets get our hands dirty
and start coding
interface LambdaFunction {
void call();
}
class FirstLambda {
public static void main(String []args) {
LambdaFunction lamb...
@FunctionalInterface
interface LambdaFunction {
void call();
}
Functional interface
Abstract method providing the signatur...
Old functional interfaces
// in java.lang package
interface Runnable { void run(); }
// in java.util package
interface Com...
Default methods in
interfaces
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw ne...
Diamond inheritance
problem
Diamond inheritance
problem?
interface Interface1 {
default public void foo() { System.out.println("Interface1’s foo"); }
...
Diamond inheritance
problem?
interface Interface1 {
default public void foo() { System.out.println("Interface1’s foo"); }
...
Effectively final variables
import java.util.Arrays;
import java.util.List;
class PigLatin {
public static void main(String...
Effectively final variables
import java.util.Arrays;
import java.util.List;
class PigLatin {
public static void main(String...
arg -> System.out.println(arg)
System.out::println
Method references - “syntactic sugar” for
lambda functions
They “route”...
Using built-in functional interfaces
List<String> strings = Arrays.asList("eeny", "meeny", "miny", "mo");
Consumer<String>...
Using built-in functional interfaces
Built-in functional interfaces are
a part of the java.util.function
package (in Java 8)
Using built-in functional interfaces
Predicate<T> Checks a condition and returns a
boolean value as result
In filter() met...
Predicate interface
Stream.of("hello", "world")
.filter(str -> str.startsWith("h"))
.forEach(System.out::println);
The filt...
Predicate interface
Predicate interface
A Predicate<T> “affirms” something as true or
false: it takes an argument of type T, and returns a
bool...
Predicate interface: example
import java.util.function.Predicate;
public class PredicateTest {
public static void main(Str...
Predicate interface: example
import java.util.List;
import java.util.ArrayList;
public class RemoveIfMethod {
public stati...
Consumer interface
Stream.of("hello", "world")
.forEach(System.out::println);
// void forEach(Consumer<? super T> action);...
Consumer interface
Consumer interface
A Consumer<T> “consumes” something: it takes
an argument (of generic type T) and returns
nothing (void)...
Consumer interface:
Example
Consumer<String> printUpperCase =
str -> System.out.println(str.toUpperCase());
printUpperCase...
Consumer interface:
Example
import java.util.stream.Stream;
import java.util.function.Consumer;
class ConsumerUse {
public...
Function interface
import java.util.Arrays;
public class FunctionUse {
public static void main(String []args) {
Arrays.str...
Function interface
Function interface
A Function<T, R> “operates” on something and
returns something: it takes one argument (of
generic type ...
Function interface: example
Function<String, Integer> strLength = str -> str.length();
System.out.println(strLength.apply(...
Function interface: example
import java.util.Arrays;
import java.util.function.Function;
public class CombineFunctions {
p...
Supplier interface
import java.util.stream.Stream;
import java.util.Random;
class GenerateBooleans {
public static void ma...
Supplier interface
Supplier interface
A Supplier<T> “supplies” takes nothing but
returns something: it has no arguments and
returns an object...
Supplier interface: example
Supplier<String> currentDateTime = () -> LocalDateTime.now().toString();
System.out.println(cu...
Summary of built-in interfaces
in java.util.function interface
❖ There are only four core functional interfaces in this pa...
Java 8 streams (and parallel streams):
Excellent example of applying functional
programming in practice
But what are streams?
Arrays.stream(Object.class.getMethods())
.map(method -> method.getName())
.distinct()
.forEach(System.out::println);
wait
...
Method[] objectMethods = Object.class.getMethods();
Stream<Method> objectMethodStream = Arrays.stream(objectMethods);
Stre...
stream pipeline
Stream	
source	
Intermediate	
opera1ons	
Terminal	
opera1on	
stream	
stream	
Examples:	
IntStream.range(),...
DoubleStream.	
of(1.0,	4.0,	9.0)		
map(Math::sqrt)		
.peek(System.out::
println)		
Stream		
Source	(with	
elements	1.0,	
4...
IntStream.range(1, 6)
You can use range or iterate
factory methods in the
IntStream interface
IntStream.iterate(1, i -> i ...
1	 	2 	3 	4 	5	
1	 	4 	9 	16 		25	
map(i	->	i	*	i)	
IntStream.range(1, 5).map(i -> i * i).forEach(System.out::println);
Us...
Stream.of (1, 2, 3, 4, 5)
.map(i -> i * i)
.peek(i -> System.out.printf("%d ", i))
.count();
prints: 1 4 9 16 25
stream can be
infinite
IntStream.iterate(0, i -> i + 2).forEach(System.out::println);
This code creates infinite stream of e...
IntStream
.iterate(0, i -> i + 2)
.limit(5)
.forEach(System.out::println);
Using the “limit” function to limit the stream ...
IntStream chars = "bookkeep".chars();
System.out.println(chars.count());
chars.distinct().sorted().forEach(ch -> System.ou...
Streams are lazy!
Files.lines(Paths.get("FileRead.java")).forEach(System.out::println);
This code prints the contents of
the file “FileRead.j...
Pattern.compile(" ").splitAsStream("java 8 streams").forEach(System.out::println);
This code splits the input string “java...
new Random().ints().limit(5).forEach(System.out::println);
Generates 5 random integers and prints
them on the console
"hello".chars().sorted().forEach(ch -> System.out.printf("%c ", ch));
Extracts characters in the string “hello”,
sorts the...
Parallel Streams
race conditions
deadlocks
I really really hate
concurrency problems
Parallel code
Serial code
long numOfPrimes = LongStream.rangeClosed(2, 100_000)
.filter(PrimeNumbers::isPrime)
.count();
System.out.println(numOfPrim...
Parallel code
Serial code
Let’s flip the switch by
calling parallel() function
long numOfPrimes = LongStream.rangeClosed(2, 100_000)
.parallel()
.filter(PrimeNumbers::isPrime)
.count();
System.out.print...
Wow! That’s an awesome flip
switch!
Internally, parallel streams make
use of fork-join framework
import java.util.Arrays;
class StringConcatenator {
public static String result = "";
public static void concatStr(String ...
Adapt, learn functional
programming!
SOLID Principles
and Design Patterns
Bootcamp - 25 JUN 2016 - Bangalore
Register here: https://www.townscript.com/e/design...
Image credits
• http://www.wetplanetwhitewater.com/images/uploads/adam_mills_elliott82.jpg
• http://s.ecrater.com/stores/3...
email sgganesh@gmail.com
website www.designsmells.com
twitter @GSamarthyam
linkedin bit.ly/sgganesh
slideshare slideshare....
Productive Programming in Java 8 - with Lambdas and Streams
Productive Programming in Java 8 - with Lambdas and Streams
Productive Programming in Java 8 - with Lambdas and Streams
Productive Programming in Java 8 - with Lambdas and Streams
Upcoming SlideShare
Loading in …5
×

Productive Programming in Java 8 - with Lambdas and Streams

6,458 views

Published on

Productive Programming in Java 8 - with Lambdas and Streams .

Published in: Software
  • Be the first to comment

Productive Programming in Java 8 - with Lambdas and Streams

  1. 1. Productive Programming in Java 8 Covering Lambdas and Streams ocpjava.wordpress.com Ganesh Samarthyam (ganesh.samarthyam@gmail.com)
  2. 2. ❖ Programming examples are from our book: ❖ Oracle Certified Professional Java SE 8 Programmer Exam 1Z0-809: A Comprehensive OCPJP 8 Certification Guide, S.G. Ganesh, Hari Kiran Kumar, Tushar Sharma, Apress, 2016. ❖ Website: ocpjava.wordpress.com
  3. 3. Java 876 … I am evolving…
  4. 4. Java 8: Latest (red-hot)
  5. 5. Recent addition: lambdas 8
  6. 6. Greek characters are scary!
  7. 7. He he, but lambdas are fun, not scary
  8. 8. Java meets functional programming (with lambdas)
  9. 9. How different is lambdas? if while for switch
  10. 10. Introducing our star feature - lambda functions
  11. 11. List<String> strings = Arrays.asList("eeny", "meeny", "miny", "mo"); Consumer<String> printString = string -> System.out.println(string); strings.forEach(printString); Lambda functions!
  12. 12. But what are lambdas?
  13. 13. Lambdas is just a fancy name for functions without a name!
  14. 14. What are lambdas? ❖ (Java 8) One way to think about lambdas is “anonymous function” or “unnamed function” - they are functions without a name and are not associated with any class ❖ Functions don’t change external state
  15. 15. Arrays.asList("eeny", "meeny", "miny", “mo”) .forEach(string -> System.out.println(string)); Internal Iteration List<String> strings = Arrays.asList("eeny", "meeny", "miny", "mo"); for(String string : strings) { System.out.println(string); } External Iteration Lambda expression
  16. 16. You can use lambdas for some amazing stuff
  17. 17. sediment pre- carbon ultra-filter post- carbon Filtered water E.g., you can compose lambda functions as in pipes-and-filters
  18. 18. $ cat limerick.txt There was a young lady of Niger Who smiled as she rode on a tiger. They returned from the ride With the lady inside And a smile on the face of the tiger.
  19. 19. $ cat limerick.txt | tr -cs "[:alpha:]" "n" | awk '{print length(), $0}' | sort | uniq 1 a 2 as 2 of 2 on 3 And 3 Who 3 she 3 the 3 was 4 They 4 With 4 face 4 from 4 lady 4 ride 4 rode 5 Niger 5 There 5 smile 5 tiger 5 young 6 inside 6 smiled 8 returned
  20. 20. List<String> lines = Files.readAllLines(Paths.get("./limerick.txt"), Charset.defaultCharset()); Map<Integer, List<String>> wordGroups = lines.stream() .map(line -> line.replaceAll("W", "n").split("n")) .flatMap(Arrays::stream) .sorted() .distinct() .collect(Collectors.groupingBy(String::length)); wordGroups.forEach( (count, words) -> { words.forEach(word -> System.out.printf("%d %s %n", count, word)); }); 1 a 2 as 2 of 2 on 3 And 3 Who 3 she 3 the 3 was 4 They 4 With 4 face 4 from 4 lady 4 ride 4 rode 5 Niger 5 There 5 smile 5 tiger 5 young 6 inside 6 smiled 8 returned
  21. 21. Lambdas & streams help in productive programming!
  22. 22. public static void main(String []file) throws Exception { // process each file passed as argument // try opening the file with FileReader try (FileReader inputFile = new FileReader(file[0])) { int ch = 0; while( (ch = inputFile.read()) != -1) { // ch is of type int - convert it back to char System.out.print( (char)ch ); } } // try-with-resources will automatically release FileReader object } public static void main(String []file) throws Exception { Files.lines(Paths.get(file[0])).forEach(System.out::println); } Existing APIs are enriched with lambdas and streams support
  23. 23. So, lets get our hands dirty and start coding
  24. 24. interface LambdaFunction { void call(); } class FirstLambda { public static void main(String []args) { LambdaFunction lambdaFunction = () -> System.out.println("Hello world"); lambdaFunction.call(); } } Functional interface - provides signature for lambda functions Lambda function/expression Call to the lambda Prints “Hello world” on the console when executed
  25. 25. @FunctionalInterface interface LambdaFunction { void call(); } Functional interface Abstract method providing the signature of the lambda function Annotation to explicitly state that it is a functional interface
  26. 26. Old functional interfaces // in java.lang package interface Runnable { void run(); } // in java.util package interface Comparator<T> { boolean compare(T x, T y); } // java.awt.event package: interface ActionListener { void actionPerformed(ActionEvent e) } // java.io package interface FileFilter { boolean accept(File pathName); }
  27. 27. Default methods in interfaces public interface Iterator<E> { boolean hasNext(); E next(); default void remove() { throw new UnsupportedOperationException("remove"); } default void forEachRemaining(Consumer<? super E> action) { Objects.requireNonNull(action); while (hasNext()) action.accept(next()); } }
  28. 28. Diamond inheritance problem
  29. 29. Diamond inheritance problem? interface Interface1 { default public void foo() { System.out.println("Interface1’s foo"); } } interface Interface2 { default public void foo() { System.out.println("Interface2’s foo"); } } public class Diamond implements Interface1, Interface2 { public static void main(String []args) { new Diamond().foo(); } } Error:(9, 8) java: class Diamond inherits unrelated defaults for foo() from types Interface1 and Interface2
  30. 30. Diamond inheritance problem? interface Interface1 { default public void foo() { System.out.println("Interface1’s foo"); } } interface Interface2 { default public void foo() { System.out.println("Interface2’s foo"); } } public class Diamond implements Interface1, Interface2 { public void foo() { Interface1.super.foo(); } public static void main(String []args) { new Diamond().foo(); } } Add this definition to resolve the ambiguity
  31. 31. Effectively final variables import java.util.Arrays; import java.util.List; class PigLatin { public static void main(String []args) { String suffix = "ay"; List<String> strings = Arrays.asList("one", "two", "three", "four"); strings.forEach(string -> System.out.println(string + suffix)); } } Accessing “local variable” suffix here; hence it is considered “effectively final”
  32. 32. Effectively final variables import java.util.Arrays; import java.util.List; class PigLatin { public static void main(String []args) { String suffix = "ay"; List<String> strings = Arrays.asList("one", "two", "three", “four"); suffix = "e"; // assign to suffix variable strings.forEach(string -> System.out.println(string + suffix)); } } PigLatinAssign.java:9: error: local variables referenced from a lambda expression must be final or effectively final strings.forEach(string -> System.out.println(string + suffix)); ^ 1 error
  33. 33. arg -> System.out.println(arg) System.out::println Method references - “syntactic sugar” for lambda functions They “route” function parameters
  34. 34. Using built-in functional interfaces List<String> strings = Arrays.asList("eeny", "meeny", "miny", "mo"); Consumer<String> printString = string -> System.out.println(string); strings.forEach(printString); List<String> strings = Arrays.asList("eeny", "meeny", "miny", "mo"); strings.forEach(string -> System.out.println(string));
  35. 35. Using built-in functional interfaces
  36. 36. Built-in functional interfaces are a part of the java.util.function package (in Java 8)
  37. 37. Using built-in functional interfaces Predicate<T> Checks a condition and returns a boolean value as result In filter() method in java.util.stream.Stream which is used to remove elements in the stream that don’t match the givenConsumer<T> Operation that takes an argument but returns nothing In forEach() method in collections and in java.util.stream.Stream; this method is used for traversing all the elements inFunction<T, R> Functions that take an argument and return a result In map() method in java.util.stream.Stream to transform or operate on the passed value and return a result.Supplier<T> Operation that returns a value to the caller (the returned value could be same or different values) In generate() method in java.util.stream.Stream to create a infinite stream of elements.
  38. 38. Predicate interface Stream.of("hello", "world") .filter(str -> str.startsWith("h")) .forEach(System.out::println); The filter() method takes a Predicate as an argument (predicates are functions that check a condition and return a boolean value)
  39. 39. Predicate interface
  40. 40. Predicate interface A Predicate<T> “affirms” something as true or false: it takes an argument of type T, and returns a boolean value. You can call test() method on a Predicate object. @FunctionalInterface public interface Predicate<T> { boolean test(T t); // other methods elided }
  41. 41. Predicate interface: example import java.util.function.Predicate; public class PredicateTest { public static void main(String []args) { Predicate<String> nullCheck = arg -> arg != null; Predicate<String> emptyCheck = arg -> arg.length() > 0; Predicate<String> nullAndEmptyCheck = nullCheck.and(emptyCheck); String helloStr = "hello"; System.out.println(nullAndEmptyCheck.test(helloStr)); String nullStr = null; System.out.println(nullAndEmptyCheck.test(nullStr)); } } Prints: true false
  42. 42. Predicate interface: example import java.util.List; import java.util.ArrayList; public class RemoveIfMethod { public static void main(String []args) { List<String> greeting = new ArrayList<>(); greeting.add("hello"); greeting.add("world"); greeting.removeIf(str -> !str.startsWith("h")); greeting.forEach(System.out::println); } } Prints: hello
  43. 43. Consumer interface Stream.of("hello", "world") .forEach(System.out::println); // void forEach(Consumer<? super T> action); Prints: hello world
  44. 44. Consumer interface
  45. 45. Consumer interface A Consumer<T> “consumes” something: it takes an argument (of generic type T) and returns nothing (void). You can call accept() method on a Consumer object. @FunctionalInterface public interface Consumer<T> { void accept(T t); // the default andThen method elided }
  46. 46. Consumer interface: Example Consumer<String> printUpperCase = str -> System.out.println(str.toUpperCase()); printUpperCase.accept("hello"); Prints: HELLO
  47. 47. Consumer interface: Example import java.util.stream.Stream; import java.util.function.Consumer; class ConsumerUse { public static void main(String []args) { Stream<String> strings = Stream.of("hello", "world"); Consumer<String> printString = System.out::println; strings.forEach(printString); } } Prints: hello world
  48. 48. Function interface import java.util.Arrays; public class FunctionUse { public static void main(String []args) { Arrays.stream("4, -9, 16".split(", ")) .map(Integer::parseInt) .map(i -> (i < 0) ? -i : i) .forEach(System.out::println); } } Prints: 4 9 16
  49. 49. Function interface
  50. 50. Function interface A Function<T, R> “operates” on something and returns something: it takes one argument (of generic type T) and returns an object (of generic type R). You can call apply() method on a Function object. @FunctionalInterface public interface Function<T, R> { R apply(T t); // other methods elided }
  51. 51. Function interface: example Function<String, Integer> strLength = str -> str.length(); System.out.println(strLength.apply("supercalifragilisticexpialidocious")); Prints: 34
  52. 52. Function interface: example import java.util.Arrays; import java.util.function.Function; public class CombineFunctions { public static void main(String []args) { Function<String, Integer> parseInt = Integer:: parseInt ; Function<Integer, Integer> absInt = Math:: abs ; Function<String, Integer> parseAndAbsInt = parseInt.andThen(absInt); Arrays.stream("4, -9, 16".split(", ")) .map(parseAndAbsInt) .forEach(System. out ::println); } } Prints: 4 9 16
  53. 53. Supplier interface import java.util.stream.Stream; import java.util.Random; class GenerateBooleans { public static void main(String []args) { Random random = new Random(); Stream.generate(random::nextBoolean) .limit(2) .forEach(System.out::println); } } Prints two boolean values “true” and “false” in random order
  54. 54. Supplier interface
  55. 55. Supplier interface A Supplier<T> “supplies” takes nothing but returns something: it has no arguments and returns an object (of generic type T). You can call get() method on a Supplier object @FunctionalInterface public interface Supplier<T> { T get(); // no other methods in this interface }
  56. 56. Supplier interface: example Supplier<String> currentDateTime = () -> LocalDateTime.now().toString(); System.out.println(currentDateTime.get()); Prints current time: 2015-10-16T12:40:55.164
  57. 57. Summary of built-in interfaces in java.util.function interface ❖ There are only four core functional interfaces in this package: Predicate, Consumer, Function, and Supplier. ❖ The rest of the interfaces are primitive versions, binary versions, and derived interfaces such as UnaryOperator interface. ❖ These interfaces differ mainly on the signature of the abstract methods they declare. ❖ You need to choose the suitable functional interface based on the context and your need.
  58. 58. Java 8 streams (and parallel streams): Excellent example of applying functional programming in practice
  59. 59. But what are streams?
  60. 60. Arrays.stream(Object.class.getMethods()) .map(method -> method.getName()) .distinct() .forEach(System.out::println); wait equals toString hashCode getClass notify notifyAll
  61. 61. Method[] objectMethods = Object.class.getMethods(); Stream<Method> objectMethodStream = Arrays.stream(objectMethods); Stream<String> objectMethodNames = objectMethodStream.map(method -> method.getName()); Stream<String> uniqueObjectMethodNames = objectMethodNames.distinct(); uniqueObjectMethodNames.forEach(System.out::println); Arrays.stream(Object.class.getMethods()) .map(method -> method.getName()) .distinct() .forEach(System.out::println); Breaking up into separate (looong) statements for our understanding
  62. 62. stream pipeline Stream source Intermediate opera1ons Terminal opera1on stream stream Examples: IntStream.range(), Arrays.stream() Examples: map(), filter(), dis1nct(), sorted() Examples: sum(), collect(), forEach(), reduce()
  63. 63. DoubleStream. of(1.0, 4.0, 9.0) map(Math::sqrt) .peek(System.out:: println) Stream Source (with elements 1.0, 4.0, and 9.0) Intermediate Opera=on 1 (maps to element values 1.0, 2.0, and 3.0) Intermediate Opera=on 2 (prints 1.0, 2.0, and 3.0) .sum(); Terminal Opera=on (returns the sum 6.0) DoubleStream.of(1.0, 4.0, 9.0) .map(Math::sqrt) .peek(System.out::println) .sum();
  64. 64. IntStream.range(1, 6) You can use range or iterate factory methods in the IntStream interface IntStream.iterate(1, i -> i + 1).limit(5)
  65. 65. 1 2 3 4 5 1 4 9 16 25 map(i -> i * i) IntStream.range(1, 5).map(i -> i * i).forEach(System.out::println); Using streams instead of imperative for i = 1 to 5, print i * i
  66. 66. Stream.of (1, 2, 3, 4, 5) .map(i -> i * i) .peek(i -> System.out.printf("%d ", i)) .count(); prints: 1 4 9 16 25
  67. 67. stream can be infinite IntStream.iterate(0, i -> i + 2).forEach(System.out::println); This code creates infinite stream of even numbers!
  68. 68. IntStream .iterate(0, i -> i + 2) .limit(5) .forEach(System.out::println); Using the “limit” function to limit the stream to 5 integers
  69. 69. IntStream chars = "bookkeep".chars(); System.out.println(chars.count()); chars.distinct().sorted().forEach(ch -> System.out.printf("%c ", ch)); Cannot “reuse” a stream; this code throws IllegalStateException
  70. 70. Streams are lazy!
  71. 71. Files.lines(Paths.get("FileRead.java")).forEach(System.out::println); This code prints the contents of the file “FileRead.java” in the current directory
  72. 72. Pattern.compile(" ").splitAsStream("java 8 streams").forEach(System.out::println); This code splits the input string “java 8 streams” based on whitespace and hence prints the strings “java”, “8”, and “streams” on the console
  73. 73. new Random().ints().limit(5).forEach(System.out::println); Generates 5 random integers and prints them on the console
  74. 74. "hello".chars().sorted().forEach(ch -> System.out.printf("%c ", ch)); Extracts characters in the string “hello”, sorts the chars and prints the chars
  75. 75. Parallel Streams
  76. 76. race conditions
  77. 77. deadlocks
  78. 78. I really really hate concurrency problems
  79. 79. Parallel code Serial code
  80. 80. long numOfPrimes = LongStream.rangeClosed(2, 100_000) .filter(PrimeNumbers::isPrime) .count(); System.out.println(numOfPrimes); Prints 9592 2.510 seconds
  81. 81. Parallel code Serial code Let’s flip the switch by calling parallel() function
  82. 82. long numOfPrimes = LongStream.rangeClosed(2, 100_000) .parallel() .filter(PrimeNumbers::isPrime) .count(); System.out.println(numOfPrimes); Prints 9592 1.235 seconds
  83. 83. Wow! That’s an awesome flip switch!
  84. 84. Internally, parallel streams make use of fork-join framework
  85. 85. import java.util.Arrays; class StringConcatenator { public static String result = ""; public static void concatStr(String str) { result = result + " " + str; } } class StringSplitAndConcatenate { public static void main(String []args) { String words[] = "the quick brown fox jumps over the lazy dog".split(" "); Arrays.stream(words).forEach(StringConcatenator::concatStr); System.out.println(StringConcatenator.result); } } Gives wrong results with with parallel() call
  86. 86. Adapt, learn functional programming!
  87. 87. SOLID Principles and Design Patterns Bootcamp - 25 JUN 2016 - Bangalore Register here: https://www.townscript.com/e/designpattern Fee Rs. 3500 Discount (Rs. 500) code: “First10”
  88. 88. Image credits • http://www.wetplanetwhitewater.com/images/uploads/adam_mills_elliott82.jpg • http://s.ecrater.com/stores/321182/53e46c705f68d_321182b.jpg • http://img.viralpatel.net/2014/01/java-lambda-expression.png • https://i.ytimg.com/vi/3C0R_fEXcYA/maxresdefault.jpg • http://farm1.static.flickr.com/74/170765090_53762a686c.jpg • http://www.monazu.com/wp-content/uploads/2012/06/ask-the-right-questions.jpg • https://s-media-cache-ak0.pinimg.com/736x/43/42/8a/43428ac2c352166374d851e895ed5db1.jpg • http://cdn.attackofthecute.com/August-17-2011-12-36-23-peekaboo- kitty-46f32anul-131384-530-410.jpeg • https://ludchurchmyblog.files.wordpress.com/2010/02/myths-legend-pictures-083.jpg • http://www.youramazingplaces.com/wp-content/uploads/2013/06/Mauvoisin-Dam- Switzerland-620x413.jpg • http://www.welikeviral.com/files/2014/08/Image-914.jpg • http://geekandpoke.typepad.com/.a/6a00d8341d3df553ef013485f6be4d970c-800wi • https://qph.fs.quoracdn.net/main-qimg-56547c0506050206b50b80a268bf2a84 • https://i.ytimg.com/vi/kCVsKsgVhBA/maxresdefault.jpg • http://i.livescience.com/images/i/000/022/395/original/man-dreams-bed.jpg • https://static-secure.guim.co.uk/sys-images/Guardian/Pix/pictures/2012/11/26/1353952826063/Alarm- clock-010.jpg
  89. 89. email sgganesh@gmail.com website www.designsmells.com twitter @GSamarthyam linkedin bit.ly/sgganesh slideshare slideshare.net/sgganesh

×