Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014...

38
Lambdas and Streams in JDK 8 Simon Ri4er Head of Java Technology Evangelism Oracle Corp Twi4er: @speakjava Copyright © 2014, Oracle and/or its affiliates. All rights reserved.

Transcript of Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014...

Page 1: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

Lambdas  and  Streams  in  JDK  8  

Simon  Ri4er  Head  of  Java  Technology  Evangelism  Oracle  Corp    Twi4er:  @speakjava  

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

Page 2: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Safe  Harbor  Statement  The  following  is  intended  to  outline  our  general  product  direcRon.  It  is  intended  for  informaRon  purposes  only,  and  may  not  be  incorporated  into  any  contract.  It  is  not  a  commitment  to  deliver  any  material,  code,  or  funcRonality,  and  should  not  be  relied  upon  in  making  purchasing  decisions.  The  development,  release,  and  Rming  of  any  features  or  funcRonality  described  for  Oracle’s  products  remains  at  the  sole  discreRon  of  Oracle.  

2  

Page 3: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

1996 … 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 1.0 5.0 6 7 8 java.lang.Thread  

java.util.concurrent  (jsr166)  

Fork/Join  Framework  (jsr166y)  

Project  Lambda  Concurrency  in  Java  

Phasers,  etc  (jsr166)  

Page 4: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Lambdas  In  Java    

Page 5: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

The  Problem:  External  IteraRon  

List<Student>  students  =  ...  double  highestScore  =  0.0;  for  (Student  s  :  students)  {      if  (s.getGradYear()  ==  2011)  {          if  (s.getScore()  >  highestScore)              highestScore  =  s.score;      }  }  

•  Our  code  controls  iteraRon  •  Inherently  serial:  iterate  from  

beginning  to  end  •  Not  thread-­‐safe      

•  Business  logic  is  stateful  •  Mutable  accumulator  variable  

Page 6: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Internal  IteraRon  With  Inner  Classes  

•  IteraRon  handled  by  the  library  •  Not  inherently  serial  –  traversal  may  be  done  in  parallel  

•  Traversal  may  be  done  lazily  –  so  one  pass,  rather  than  three  

•  Thread  safe  –  client  logic  is  stateless  •  High  barrier  to  use  

– SyntacRcally  ugly  

More  FuncRonal  double  highestScore  =  students      .filter(new  Predicate<Student>()  {          public  boolean  op(Student  s)  {              return  s.getGradYear()  ==  2011;          }      })      .map(new  Mapper<Student,Double>()  {          public  Double  extract(Student  s)  {              return  s.getScore();          }      })      .max();  

Page 7: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Internal  IteraRon  With  Lambdas  List<Student>  students  =  ...  double  highestScore  =  students                        .filter(Student  s  -­‐>  s.getGradYear()  ==  2011)                        .map(Student  s  -­‐>  s.getScore())                        .max();  

•  More  readable  •  More  abstract  

•  Less  error-­‐prone  

NOTE:  This  is  not  JDK8  code  

Page 8: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Lambda  Expressions  

•  Lambda  expressions  represent  anonymous  funcRons  – Same  structure  as  a  method  

•  typed  argument  list,  return  type,  set  of  thrown  excepRons,  and  a  body  

– Not  associated  with  a  class  • We  now  have  parameterised  behaviour,  not  just  values  

Some  Details  

double  highestScore  =  students.                      filter(Student  s  -­‐>  s.getGradYear()  ==  2011).                      map(Student  s  -­‐>  s.getScore())                      max();  

What  

How  

Page 9: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Lambda  Expression  Types  

•  Single-­‐method  interfaces  are  used  extensively  in  Java  – DefiniRon:  a  func2onal  interface  is  an  interface  with  one  abstract  method  – Func2onal  interfaces  are  idenRfied  structurally  – The  type  of  a  lambda  expression  will  be  a  func2onal  interface  

•  Lambda  expressions  provide  implementaRons  of  the  abstract  method  

interface  Comparator<T>    {  boolean  compare(T  x,  T  y);  }    interface  FileFilter          {  boolean  accept(File  x);  }    interface  Runnable              {  void  run();  }    interface  ActionListener  {  void  actionPerformed(…);  }    interface  Callable<T>        {  T  call();  }  

Page 10: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Local  Variable  Capture  

•  Lambda  expressions  can  refer  to  effec2vely  final  local  variables  from  the  enclosing  scope  

•  EffecRvely  final:  A  variable  that  meets  the  requirements  for  final  variables  (i.e.,  assigned  once),  even  if  not  explicitly  declared  final  

•  Closures  on  values,  not  variables  

void  expire(File  root,  long  before)  {        root.listFiles(File  p  -­‐>  p.lastModified()  <=  before);  

}  

Page 11: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

What  Does  ‘this’  Mean  For  Lambdas?  

•  ‘this’  refers  to  the  enclosing  object,  not  the  lambda  itself  •  Think  of  ‘this’  as  a  final  predefined  local  •  Remember  the  Lambda  is  an  anonymous  func2on  

–  It  is  not  associated  with  a  class  –  Therefore  there  can  be  no  ‘this’  for  the  Lambda  

Page 12: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Referencing  Instance  Variables  Which  are  not  final,  or  effecRvely  final    class  DataProcessor  {      private  int  currentValue;        public  void  process()  {          DataSet  myData  =  myFactory.getDataSet();          dataSet.forEach(d  -­‐>  d.use(currentValue++));      }  }  

Page 13: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Referencing  Instance  Variables  The  compiler  helps  us  out    class  DataProcessor  {      private  int  currentValue;        public  void  process()  {          DataSet  myData  =  myFactory.getDataSet();          dataSet.forEach(d  -­‐>  d.use(this.currentValue++);      }  }  

‘this’  (which  is  effecRvely  final)  inserted  by  the  compiler  

Page 14: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Type  Inference  

•  The  compiler  can  ogen  infer  parameter  types  in  a  lambda  expression  § Inferrence  based  on  the  target  funcRonal  interface’s  method  signature  

•  Fully  staRcally  typed  (no  dynamic  typing  sneaking  in)  – More  typing  with  less  typing  

List<String>  list  =  getList();  Collections.sort(list,  (String  x,  String  y)  -­‐>  x.length()  -­‐  y.length());  

Collections.sort(list,  (x,  y)  -­‐>  x.length()  -­‐  y.length());  

static  T  void  sort(List<T>  l,  Comparator<?  super  T>  c);  

Page 15: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Method  References  

•  Method  references  let  us  reuse  a  method  as  a  lambda  expression  

FileFilter  x  =  File  f  -­‐>  f.canRead();  

FileFilter  x  =  File::canRead;  

Page 16: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Constructor  References  

•  Same  concept  as  a  method  reference  – For  the  constructor  

Factory<List<String>>  f  =  ArrayList<String>::new;  

Factory<List<String>>  f  =  ()  -­‐>  return  new  ArrayList<String>();  

Replace  with  

Page 17: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Library  EvoluRon    

Page 18: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Library  EvoluRon  Goal  

• Requirement:  aggregate  operaRons  on  collecRons  – New  methods  required  on  CollecRons  to  facilitate  this  

         

• This  is  problemaRc  – Can’t  add  new  methods  to  interfaces  without  modifying  all  implementaRons  – Can’t  necessarily  find  or  control  all  implementaRons  

int  heaviestBlueBlock  =  blocks                        .filter(b  -­‐>  b.getColor()  ==  BLUE)                        .map(Block::getWeight)                        .reduce(0,  Integer::max);  

Page 19: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

SoluRon:  Default  Methods  

• Specified  in  the  interface  • From  the  caller’s  perspecRve,  just  an  ordinary  interface  method  • Provides  a  default  implementaRon  

•  Default  only  used  when  implementaRon  classes  do  not  provide  a  body  for  the  extension  method  

•  ImplementaRon  classes  can  provide  a  be4er  version,  or  not  

interface  Collection<E>  {        default  Stream<E>  stream()  {            return  StreamSupport.stream(spliterator());      }    }  

Page 20: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Virtual  Extension  Methods  

•  Err,  isn’t  this  implemenRng  mulRple  inheritance  for  Java?      •  Yes,  but  Java  already  has  mulRple  inheritance  of  types  •  This  adds  mulRple  inheritance  of  behavior  too  •  But  not  state,  which  is  where  most  of  the  trouble  is  •  Can  sRll  be  a  source  of  complexity    

•  Class  implements  two  interfaces,  both  of  which  have  default  methods  •  Same  signature  •  How  does  the  compiler  differenRate?  

•  StaRc  methods  also  allowed  in  interfaces  in  Java  SE  8  

Stop  right  there!  

Page 21: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

FuncRonal  Interface  DefiniRon  

•  Single  Abstract  Method  (SAM)  type  • A  funcRonal  interface  is  an  interface  that  has  one  abstract  method  

– Represents  a  single  funcRon  contract  – Doesn’t  mean  it  only  has  one  method  

• @FunctionalInterface  annotaRon  – Helps  ensure  the  funcRonal  interface  contract  is  honoured  – Compiler  error  if  not  a  SAM  

Page 22: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Lambdas  In  Full  Flow:  Streams  

 

Page 23: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Stream  Overview  

• AbstracRon  for  specifying  aggregate  computaRons  – Not  a  data  structure  – Can  be  infinite  

•  Simplifies  the  descripRon  of  aggregate  computaRons  – Exposes  opportuniRes  for  opRmisaRon  – Fusing,  laziness  and  parallelism  

At  The  High  Level  

Page 24: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Stream  Overview  

• A  stream  pipeline  consists  of  three  types  of  things  – A  source  – Zero  or  more  intermediate  operaRons  – A  terminal  operaRon  

•  Producing  a  result  or  a  side-­‐effect  

Pipeline  

int  total  =  transactions.stream()      .filter(t  -­‐>  t.getBuyer().getCity().equals(“London”))      .mapToInt(Transaction::getPrice)      .sum();  

Source  

Intermediate  operaRon  Terminal  operaRon  

Page 25: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Stream  Sources  

•  From  collecRons  and  arrays  – Collection.stream()  – Collection.parallelStream()  – Arrays.stream(T  array)  or  Stream.of()  

•  StaRc  factories  – IntStream.range()  – Files.walk()  

• Roll  your  own  – java.util.Spliterator  

Many  Ways  To  Create  

Page 26: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Stream  Terminal  OperaRons  

•  The  pipeline  is  only  evaluated  when  the  terminal  operaRon  is  called  – All  operaRons  can  execute  sequenRally  or  in  parallel  – Intermediate  operaRons  can  be  merged  

•  Avoiding  mulRple  redundant  passes  on  data  •  Short-­‐circuit  operaRons  (e.g.  findFirst)  •  Lazy  evaluaRon  

– Stream  characterisRcs  help  idenRfy  opRmisaRons  •  DISTINT  stream  passed  to  distinct()  is  a  no-­‐op  

Page 27: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Maps  and  FlatMaps  Map  Values  in  a  Stream  

Map  

FlatMap  

Input  Stream  

Input  Stream  

1-­‐to-­‐1  mapping  

1-­‐to-­‐many  mapping  

Output  Stream  

Output  Stream  

Page 28: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

OpRonal  Class  

•  Terminal  operaRons  like  min(),  max(),  etc  do  not  return  a  direct  result  •  Suppose  the  input  Stream  is  empty?  • Optional<T>  

– Container  for  an  object  reference  (null,  or  real  object)  – Think  of  it  like  a  Stream  of  0  or  1  elements  – use  get(),  ifPresent()  and  orElse()  to  access  the  stored  reference  – Can  use  in  more  complex  ways:  filter(),  map(),  etc  

Helping  To  Eliminate  the  NullPointerException  

Page 29: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Example  1  Convert  words  in  list  to  upper  case  

List<String>  output  =  wordList      .stream()      .map(String::toUpperCase)      .collect(Collectors.toList());  

Page 30: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Example  1  Convert  words  in  list  to  upper  case  (in  parallel)  

List<String>  output  =  wordList      .parallelStream()      .map(String::toUpperCase)      .collect(Collectors.toList());  

Page 31: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Example  2  

• BufferedReader  has  new  method  – Stream<String>  lines()  

 

Count  lines  in  a  file  

long  count  =  bufferedReader      .lines()      .count();  

Page 32: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Example  3  Join  lines  3-­‐4  into  a  single  string  

String  output  =  bufferedReader      .lines()      .skip(2)      .limit(2)      .collect(Collectors.joining());  

Page 33: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Example  4  Collect  all  words  in  a  file  into  a  list  

List<String>  output  =  reader      .lines()      .flatMap(line  -­‐>  Stream.of(line.split(REGEXP)))      .filter(word  -­‐>  word.length()  >  0)      .collect(Collectors.toList());  

Page 34: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Example  5  List  of  unique  words  in  lowercase,  sorted  by  length  

List<String>  output  =  reader      .lines()      .flatMap(line  -­‐>  Stream.of(line.split(REGEXP)))      .filter(word  -­‐>  word.length()  >  0)      .map(String::toLowerCase)      .distinct()      .sorted((x,  y)  -­‐>  x.length()  -­‐  y.length())      .collect(Collectors.toList());  

Page 35: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Example  6:  Real  World  Infinite  stream  from  thermal  sensor  

private  int  double  currentTemperature;  ...    thermalReader      .lines()      .mapToDouble(s  -­‐>                  Double.parseDouble(s.substring(0,  s.length()  -­‐  1)))      .map(t  -­‐>  ((t  –  32)  *  5  /  9)      .filter(t  -­‐>  t  !=  currentTemperature)      .peek(t  -­‐>  listener.ifPresent(l  -­‐>  l.temperatureChanged(t)))      .forEach(t  -­‐>  currentTemperature  =  t);  

Page 36: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Example  6:  Real  World  Infinite  stream  from  thermal  sensor  

private  int  double  currentTemperature;  ...    thermalReader      .lines()      .mapToDouble(s  -­‐>                  Double.parseDouble(s.substring(0,  s.length()  -­‐  )))      .map(t  -­‐>  ((t  –  32)  *  5  /  9)      .filter(t  -­‐>  t  !=  this.currentTemperature)      .peek(t  -­‐>  listener.ifPresent(l  -­‐>  l.temperatureChanged(t)))      .forEach(t  -­‐>  this.currentTemperature  =  t);  

Page 37: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

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

Conclusions  

•  Java  needs  lambda  statements    – Significant  improvements  in  exisRng  libraries  are  required  

• Require  a  mechanism  for  interface  evoluRon  – SoluRon:  virtual  extension  methods  

• Bulk  operaRons  on  CollecRons  – Much  simpler  with  Lambdas  

•  Java  SE  8  evolves  the  language,  libraries,  and  VM  together  

Page 38: Lambdas’and’Streams’in’JDK’8’ · Copyright©’2014 ,’Oracle’and/or’its’affiliates.’All’rights’reserved.’’’ Virtual’Extension’Methods’ • Err,’isn’tthis’implemenRng

Simon  Ri4er  Oracle  CorporarRon    Twi4er:  @speakjava  

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