overview lambda streams

32
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 1

Upload: oracle-fusion-middleware

Post on 08-Sep-2014

2.223 views

Category:

Technology


0 download

DESCRIPTION

This presentation was created by Stuart Marks and was used at Japanese JUG event (JJUG CCC) at 5/15(Sun).

TRANSCRIPT

Page 1: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 1

Page 2: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 2

The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle.

Page 3: Overview Lambda Streams

Overview of Java 8 Lambda and Streams Stuart W. Marks Principal Member of Technical Staff

Twitter: @stuartmarks

Page 4: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 4

What is a Lambda?

 A lambda is a function.

 A function is a computation that takes parameters and returns a value.

 Until Java 8, functions could only be implemented using methods.

 A lambda enables functions to be passed around or stored like data.

Page 5: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 5

Example: Sorting a List of Objects

class Person { String name; int age; String getName() { return name; } int getAge() { return age; } } List<Person> list = ... ; Collections.sort(list, ??? );

Page 6: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 6

Example: Sorting a List of Objects

List<Person> list = ... ; public int compare(Person p1, Person p2) { return p1.getName().compareTo(p2.getName()); } Collections.sort(list, ??? );

Page 7: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 7

Example: Sorting a List of Objects

List<Person> list = ... ; class ComparePersonsByName implements Comparator<Person> { @Override public int compare(Person p1, Person p2) { return p1.getName().compareTo(p2.getName()); } } Collections.sort(list, ??? );

Page 8: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 8

Example: Sorting a List of Objects

List<Person> list = ... ; class ComparePersonsByName implements Comparator<Person> { @Override public int compare(Person p1, Person p2) { return p1.getName().compareTo(p2.getName()); } } Collections.sort(list, new ComparePersonsByName());

Page 9: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 9

Example: Sorting a List of Objects

List<Person> list = ... ; Collections.sort(list, new Comparator<Person>() { @Override public int compare(Person p1, Person p2) { return p1.getName().compareTo(p2.getName()); } });

Page 10: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 10

Example: Sorting a List of Objects

List<Person> list = ... ; Collections.sort(list, (Person p1, Person p2) { return p1.getName().compareTo(p2.getName()); } );

Page 11: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 11

Example: Sorting a List of Objects

List<Person> list = ... ; Collections.sort(list, (Person p1, Person p2) -> p1.getName().compareTo(p2.getName()) );

Page 12: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 12

Example: Sorting a List of Objects

List<Person> list = ... ; Collections.sort(list, (p1, p2) -> p1.getName().compareTo(p2.getName()) );

Page 13: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 13

Functional Interfaces

interface Runnable { public void run(); } new Thread(new Runnable() { @Override public void run() { System.out.println("Hello, thread!"); } }); new Thread(() -> System.out.println("Hello, thread!"));

Page 14: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 14

New APIs Using Functional Interfaces

List<Person> list = ... ; for (Person p : list) { System.out.println(p); } list.forEach(p -> System.out.println(p));

Page 15: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 15

New APIs Using Functional Interfaces

List<Person> list = Collections.synchronizedList(...); for (Person p : list) { System.out.println(p); } list.forEach(p -> System.out.println(p));

Page 16: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 16

New APIs Using Functional Interfaces

List<Person> list = ... ; for (Person p : list) { if ("Jones".equals(p.getName())) { ??? how to remove this Person ??? } }

Page 17: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 17

New APIs Using Functional Interfaces

List<Person> list = ... ; for (Iterator<Person> iter = list.iterator(); iter.hasNext(); ) { Person p = iter.next(); if ("Jones".equals(p.getName())) { iter.remove(); } } list.removeIf(p -> "Jones".equals(p.getName()));

Page 18: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 18

New APIs Using Functional Interfaces

List<String> list = Arrays.asList("Alpha", "Bravo", "Charlie", "Delta", "Echo", "Foxtrot", "Golf"); for (ListIterator<String> iter = list.listIterator(); iter.hasNext(); ) { iter.set(iter.next().toUpperCase()); } list.replaceAll(s -> s.toUpperCase()); list.replaceall(String::toUpperCase); // method reference

Page 19: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 19

Default Methods Added to Collections

Iterable.forEach(lambda) Collection.removeIf(lambda) List.replaceAll(lambda) List.sort(lambda) // replaces static method Collections.sort()

Page 20: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 20

Default Methods Added to Collections

Collections.sort(list, (p1, p2) -> p1.getName().compareTo(p2.getName()) ); list.sort( (p1, p2) -> p1.getName().compareTo(p2.getName()));

Page 21: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 21

Combining Operations

 New collection operations include forEach, removeIf, replaceAll  Each operates on a collection, possibly modifying it  What if we want to combine these operations?

–  for example, operate only certain elements that meet some criterion  Using collections, we'd need to copy and create temporary collections  Solution: streams

Page 22: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 22

Streams

 Streams: a multiplicity of values –  no storage –  might or might not be ordered –  sort-of like an iterator –  affords serial or parallel processing

 Stream pipeline: –  a source –  zero or more intermediate operations –  a terminal operation

Page 23: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 23

Streams

 Sources –  collections, array, varargs parameters, numeric range, lines of file

  Intermediate operations –  filter, map, distinct, sorted, skip, limit, flatMap

 Terminal operations –  forEach, toArray, collect, reduce, count, min, max –  findFirst, findAny, anyMatch, allMatch, noneMatch

Page 24: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 24

Streams Example

// Given a list of persons, generate a sorted list of // names that longer than longer than 3 characters. List<Person> persons = ... ; persons.stream() .map(p -> p.getName()) .filter(s -> s.codePointCount(0, s.length()) > 3) .sorted() .forEach(s -> System.out.println(s));

Page 25: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 25

Streams Example

// Given a list of persons, generate a sorted list of // names that longer than longer than 3 characters. List<Person> persons = ... ; persons.stream() .map(p -> p.getName()) .filter(s -> s.codePointCount(0, s.length()) > 3) .sorted() .forEach(System.out::println);

Page 26: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 26

Streams Example

// Given a list of persons, generate a sorted list of // names that longer than longer than 3 characters. List<Person> persons = ... ; List<String> sortedNames = persons.stream() .map(p -> p.getName()) .filter(s -> s.codePointCount(0, s.length()) > 3) .sorted() .collect(Collectors.toList());

Page 27: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 27

Streams Example

// Calculate pi using the Taylor Series // pi = 4 * (1 – 1/3 + 1/5 – 1/7 + ...) System.out.println( LongStream.range(0L, 1_000_000_000L) .map(i -> ((i & 1) == 0 ? 1 : -1) * (2 * i + 1)) .mapToDouble(i -> 4.0 / i) .sum());

Page 28: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 28

Streams Example

// Calculate pi using the Taylor Series // pi = 4 * (1 – 1/3 + 1/5 – 1/7 + ...) System.out.println( LongStream.range(0L, 1_000_000_000L) .parallel() .map(i -> ((i & 1) == 0 ? 1 : -1) * (2 * i + 1)) .mapToDouble(i -> 4.0 / i) .sum());

Page 29: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 29

Summary

 Lambdas: anonymous functions  Default methods  Method references  Streams: allow pipelined operations on multiple values

–  programmed using lambda –  enable parallelism

Lambdas and streams make code read more like the problem statement, resulting in code that is clear, concise, and easy to maintain.

Page 30: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 30

Java 8 Resources

 Download: java.oracle.com  Documentation & Tutorials: docs.oracle.com/javase  Source code: openjdk.java.net/projects/jdk8  FAQ: lambdafaq.org  Technical documents: openjdk.java.net/projects/lambda

–  State of the Lambda –  State of the Lambda: Libraries Edition

Page 31: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 31

The preceding is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle.

Page 32: Overview Lambda Streams

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 32