java 8
DESCRIPTION
Slides of talk given at Vilnius JUG meeting #9 (2012-11-14)TRANSCRIPT
![Page 1: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/1.jpg)
Java 8Interesting parts
Vaidas Pilkauskas, Kasparas RudokasVilnius JUG
![Page 2: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/2.jpg)
Agenda● Lambda● Date & Time● PermGen● Annotations
![Page 3: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/3.jpg)
LambdaJSR 335
![Page 4: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/4.jpg)
lambda vs. closureA lambda is just an anonymous function.
myCollection.filter(e ‑> e.length() >= 5)
A closure is any function which closes over the environment in which it was defined. This means that it can access variables not in its parameter list.
int minLength = 5;myCollection.filter(new Predicate(){ boolean apply(MyElement e) { return e != null ? e.length >= minLength : false; }})
![Page 5: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/5.jpg)
Project Lambda (JSR 335)● Language changes
○ Lambda Expression○ Virtual Extension Method
● Library changes○ Functional API○ Parallel collections○ Bulk Operations
![Page 6: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/6.jpg)
ProblemString[] names = {"Alice", "Bob", "Charlie", Dave"};Arrays.sort(names, new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.compareToIgnoreCase(o2); }});
![Page 7: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/7.jpg)
"tiny" anonymous inner class String[] names = {"Alice", "Bob", "Charlie", Dave"};Arrays.sort(names, new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.compareToIgnoreCase(o2); }});
![Page 8: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/8.jpg)
"tiny" and useful● callbacks● runnables● event handlers● comparators● ...and many other cases
![Page 9: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/9.jpg)
All we need!String[] names = {"Alice", "Bob", "Charlie", Dave"};Arrays.sort(names, new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.compareToIgnoreCase(o2); }});
![Page 10: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/10.jpg)
Solution - closureString[] names = {"Alice", "Bob", "Charlie", Dave"};Arrays.sort(names, (o1, o2) -> o1.compareToIgnoreCase(o2));
![Page 11: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/11.jpg)
What do we mean by closures?
● a unit of deferred execution● code that can be passed as a value● can be used in an assignment
statement● capture of a surrounding environment
![Page 12: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/12.jpg)
Lambda Expressionss -> s.length()(int x, int y) -> x+y() -> 42
(x, y, z) -> { if (x == y) return x; else { int result = y; for (int i = 1; i < z; i++) result *= i; return result; }}
![Page 13: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/13.jpg)
Lambda Syntaxprincipally because something similar has been generally well-received in other Java-like languages (C# and Scala), and a clearly "better" alternative did not present itself
![Page 14: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/14.jpg)
Lambda● Effectively final variables
![Page 15: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/15.jpg)
Lambda● Effectively final variables● Shadowing
![Page 16: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/16.jpg)
Lambda● Effectively final variables● Shadowing● break, continue must be local
![Page 17: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/17.jpg)
Lambda● Effectively final variables● Shadowing● break, continue must be local● this - lambda is not an instance
method. (this == surrounding context object)
![Page 18: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/18.jpg)
Lambda● Effectively final variables● Shadowing● break, continue must be local● this - lambda is not an instance
method. (this == surrounding context object)
● throw completes method abruptly
![Page 19: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/19.jpg)
Functional InterfacesA functional interface is an interface that has just one abstract method, and thus represents a single function contract.
![Page 20: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/20.jpg)
Functional InterfacesSAM - Single Abstract Method interfacesone method excluding Object methodsinterface Runnable { void run(); } // Functional
interface Foo { boolean equals(Object obj); } // Not functional; equals is already an implicit member
interface Comparator<T> { boolean equals(Object obj); int compare(T o1, T o2);}// Functional; Comparator has one abstract non-Object method
![Page 21: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/21.jpg)
Method ReferencesMethod reference is a shorthand for a lambda invoking just that method
System::getProperty"abc"::lengthString::lengthsuper::toStringArrayList::new
Arrays.sort(ints, Integer::compareTo);
![Page 22: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/22.jpg)
Method ReferencesStatic methods simply translate like lambda with same arguments and return type
class Math { public static int max(int a, int b) {...}}interface Operator<T> { T eval(T left, T right);}Operator<Integer> lambda = (a, b) -> Math.max(a, b);Operator<Integer> methodRef = Math::max;
![Page 23: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/23.jpg)
Method ReferencesNon static method reference of type T translates like lambda with an additional argument of type T
Comparator<String> c = (s1, s2) -> s1.compareToIgnoreCase(s2);
//translates to:Comparator<String> c = String::compareToIgnoreCase;
![Page 24: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/24.jpg)
Method ReferencesInstance method reference translates like lambda with same arguments and return type (and implicit receiver)
Callable<Integer> l = () -> "boo".length();//translates to:Callable<Integer> c = "boo"::length;
![Page 25: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/25.jpg)
Method ReferencesString[] names = {"Alice", "Bob", "Charlie", Dave"};Arrays.sort(names, (o1, o2) -> o1.compareToIgnoreCase(o2));
//translates to
String[] names = {"Alice", "Bob", "Charlie", Dave"};Arrays.sort(names, String::compareToIgnoreCase);
![Page 26: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/26.jpg)
Compatibility
Cannot add new interface methods (without forcing current interface users to implement them)
But we need new lambda enabled methods (on Java core libraries!)
![Page 27: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/27.jpg)
Default methods (also known as)
● virtual extension methods● defender methods
![Page 28: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/28.jpg)
Default methodsinterface NormalInterface { void myNormalMethod(); void myDefaultMethod () default { System.out.println("-> myDefaultMethod"); }}
class NormalInterfaceImpl implements NormalInterface { @Override public void myNormalMethod() { System.out.println("-> myNormalMethod"); }}
![Page 29: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/29.jpg)
Functional CollectionsMajor changes in collection API:● Internal iteration support with Iterable/Stream interfaces
(forEach, filter, map, etc)
![Page 30: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/30.jpg)
Functional CollectionsMajor changes in collection API:● Internal iteration support with Iterable/Stream interfaces
(forEach, filter, map, etc)● Explicit parallel APIs for greater parallelism support.
These can be combined with Fork/Join to divide the tasks
![Page 31: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/31.jpg)
Functional CollectionsMajor changes in collection API:● Internal iteration support with Iterable/Stream interfaces
(forEach, filter, map, etc)● Explicit parallel APIs for greater parallelism support.
These can be combined with Fork/Join to divide the tasks
● Greater stress on immutability and avoiding in-place mutation which was done in the conventional for-each loops
![Page 32: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/32.jpg)
ExampleString[] names = {"Alice", "Bob", "Charlie", "Dave"};
List<String> filteredNames = Streams.stream(names) .filter(e -> e.length() >= 4) .into(new ArrayList<>());
filteredNames.stream().forEach(System.out::println);
![Page 33: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/33.jpg)
Streams● No storage - nothing is stored in stream
![Page 34: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/34.jpg)
Streams● No storage - nothing is stored in stream● Functional in nature - new values are produced
![Page 35: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/35.jpg)
Streams● No storage - nothing is stored in stream● Functional in nature - new values are produced● Laziness-seeking. Many operations can be
implemented lazily
![Page 36: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/36.jpg)
Streams● No storage - nothing is stored in stream● Functional in nature - new values are produced● Laziness-seeking. Many operations can be
implemented lazily● Bounds optional. Think of infinite stream
![Page 37: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/37.jpg)
Functional interfacesjava.util.functions● Predicate - a property of the object passed as
argument● Block - an action to be performed with the object
passed as argument● Mapper - transform a T to a U● ...
![Page 38: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/38.jpg)
Parallelism//sequentialint sum = myCollection.stream() .filter(b -> b.getColor() == BLUE) .map(b -> b.getWeight()) .sum();//parallelint sum = myCollection.parallel() .filter(b -> b.getColor() == BLUE) .map(b -> b.getWeight()) .sum();
![Page 39: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/39.jpg)
Advantages● Elements may be computed lazily. If we apply a Mapper
to a collection of a thousand elements but only iterate over the first three, the remaining elements will never be mapped.
![Page 40: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/40.jpg)
Advantages● Elements may be computed lazily. If we apply a Mapper
to a collection of a thousand elements but only iterate over the first three, the remaining elements will never be mapped.
● Method chaining is encouraged. Hence there's no need to store intermediate results in their own collections.
![Page 41: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/41.jpg)
Advantages● Elements may be computed lazily. If we apply a Mapper
to a collection of a thousand elements but only iterate over the first three, the remaining elements will never be mapped.
● Method chaining is encouraged. Hence there's no need to store intermediate results in their own collections.
● Internal iteration hides implementation decisions. For example, we could parallelize a map() operation just by writing myCollection.parallel().map(e ‑> e.length()).
![Page 42: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/42.jpg)
Try it out today!The prototype compiler is being implemented in OpenJDK.● Source code is available at http://hg.openjdk.java.
net/lambda/lambda● Binary snapshots of the lambda-enabled JDK prototype
are available athttp://jdk8.java.net/lambdaIDE support:● Netbeans 8 Nightly Builds with experimental Lambda
support● IDEA 12 EAP with experimental Lambda support
![Page 43: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/43.jpg)
Date & Time APIJSR 310
![Page 44: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/44.jpg)
Oldies: Date● Mutable
![Page 45: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/45.jpg)
Oldies: Date● Mutable● Years being indexed from 1900
![Page 46: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/46.jpg)
Oldies: Date● Mutable● Years being indexed from 1900● Months being indexed from 0
![Page 47: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/47.jpg)
Oldies: Date● Mutable● Years being indexed from 1900● Months being indexed from 0
Ex.: Date d = new Date(1L); System.out.println(d.toString());
![Page 48: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/48.jpg)
Oldies: Date● Mutable● Years being indexed from 1900● Months being indexed from 0
Ex.: Date d = new Date(1L); System.out.println(d.toString()); //Thu Jan 01 02:00:00 EET 1970
![Page 49: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/49.jpg)
Oldies: Calendar● Mutable
![Page 50: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/50.jpg)
Oldies: Calendar● Mutable● Not very convenient (lack of simple field
methods)
![Page 51: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/51.jpg)
Oldies: Calendar● Mutable● Not very convenient (lack of simple field
methods)● Very difficult to extend (add new calendars)
![Page 52: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/52.jpg)
Oldies: Calendar● Mutable● Not very convenient (lack of simple field
methods)● Very difficult to extend (add new calendars)
Ex.: Calendar c = Calendar.getInstance(); int weekday = c.get(DAY_OF_WEEK);
![Page 53: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/53.jpg)
Oldies: Calendar● Mutable● Not very convenient (lack of simple field
methods)● Very difficult to extend (add new calendars)
Ex.: Calendar c = Calendar.getInstance(); int weekday = c.get(DAY_OF_WEEK); Date d = c.getTime();
![Page 54: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/54.jpg)
Under pressure...
![Page 55: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/55.jpg)
JSR 310● Immutable
![Page 56: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/56.jpg)
JSR 310● Immutable● Defines consistent language for domain
○ Offset from UTC vs TimeZone○ Machine vs Human○ ISO 8601
![Page 57: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/57.jpg)
JSR 310● Immutable● Defines consistent language for domain
○ Offset from UTC vs TimeZone○ Machine vs Human○ ISO 8601
● No old Date/Calendar usage (clean)
![Page 58: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/58.jpg)
● Immutable● Defines consistent language for domain
○ Offset from UTC vs TimeZone○ Machine vs Human○ ISO 8601
● No old Date/Calendar usage (clean)● Extensible
JSR 310
![Page 59: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/59.jpg)
JSR 310● Immutable● Defines consistent language for domain
○ Offset from UTC vs TimeZone○ Machine vs Human○ ISO 8601
● No old Date/Calendar usage (clean)● Extensible● Led by JodaTime creator (S. Colebourne)
![Page 60: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/60.jpg)
Example: JSR 310Clock clock = Clock.systemUTC();LocalDate localDate = LocalDate.now(clock);//2012-11-13
![Page 61: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/61.jpg)
Example: JSR 310Clock clock = Clock.systemUTC();LocalDate localDate = LocalDate.now(clock);//2012-11-13
MonthDay brasilBday = MonthDay.of(JUNE, 21);
![Page 62: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/62.jpg)
Example: JSR 310Clock clock = Clock.systemUTC();LocalDate localDate = LocalDate.now(clock);//2012-11-13
MonthDay brasilBday = MonthDay.of(JUNE, 21);
ZoneId zoneId = ZoneId.of("America/New_York");Clock clock = Clock.system(zoneId);ZonedDateTime zonedDateTimeUS = ZonedDateTime.now(clock);//2012-11-11T04:17:58.693-05:00[America/New_York]
![Page 63: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/63.jpg)
Example: JSR 310import static javax.time.calendrical.LocalPeriodUnit.HOURS;
Period p = Period.of(5, HOURS);LocalTime time = LocalTime.now();LocalTime newTime;newTime = time.plus(5, HOURS);// ornewTime = time.plusHours(5);// ornewTime = time.plus(p);
![Page 64: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/64.jpg)
Why not Joda Time?● Machine timelines ● Pluggable chronology ● Nulls● Internal implementation
![Page 65: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/65.jpg)
VM/GCJEP 122 & JEP 156
![Page 66: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/66.jpg)
PermGen removal● Java Heap vs PermGen
![Page 67: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/67.jpg)
PermGen removal● Java Heap vs PermGen
![Page 68: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/68.jpg)
PermGen removal● Java Heap vs PermGen
● Why it was required anyway?
![Page 69: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/69.jpg)
PermGen removal● Java Heap vs PermGen
● Why it was required anyway?● So what?
![Page 70: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/70.jpg)
AnnotationsJSR 308 & JEP 120
![Page 71: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/71.jpg)
Type Annotations● In Java 7 we have annotations on
declarations
Ex.:
class SomeClass { … }class ListElement<E> { … }public void v() (int I) { long l;{
![Page 72: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/72.jpg)
Type Annotations● JSR-308 brings annotations on Type use ● Are an enabler for the checkers framework
Ex.:
new @Interned MyObject(); myString = (@NonNull String) myObject; void monitorTemperature() throws @Critical TemperatureException { ... }
![Page 73: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/73.jpg)
Repeating Annotations● Before
@Schedules ({ @Schedule(dayOfMonth="Last"), @Schedule(dayOfWeek="Fri", hour="23")({public void doPeriodicCleanup() { ... }
![Page 74: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/74.jpg)
Repeating Annotations● Before
@Schedules ({ @Schedule(dayOfMonth="Last"), @Schedule(dayOfWeek="Fri", hour="23")({public void doPeriodicCleanup() { ... }
● After@Schedule(dayOfMonth="Last”)@Schedule(dayOfWeek="Fri", hour="23")public void doPeriodicCleanup() { ... }
![Page 75: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/75.jpg)
Q&A
![Page 76: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/76.jpg)
References* Lambda
http://stackoverflow.com/questions/220658/what-is-the-difference-between-a-closure-and-a-lambda
http://openjdk.java.net/projects/lambda/
http://jcp.org/aboutJava/communityprocess/edr/jsr335/index2.html
http://vimeo.com/48577033 (slides: http://www.slideshare.net/tkowalcz/java-gets-a-closure)
http://datumedge.blogspot.co.uk/2012/06/java-8-lambdas.html
http://www.theserverside.com/news/thread.tss?thread_id=68718
http://medianetwork.oracle.com/video/player/1785479333001
https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=6080
https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=5089
http://www.lektorium.tv/lecture/?id=14048
http://www.lektorium.tv/lecture/?id=14049
http://blog.xebia.com/2012/11/05/report-will-java-8s-lambda-change-the-face-of-the-world/
http://www.slideshare.net/fsarradin/java-8-lambda
http://programmers.stackexchange.com/questions/173441/what-triggered-the-popularity-of-lambda-functions-in-modern-mainstream-programmi?newsletter=1&nlcode=29983%7c903a
http://www.slideshare.net/bje/java-closures
* Collections
http://www.javabeat.net/2012/05/enhanced-collections-api-in-java-8-supports-lambda-expressions/
http://cr.openjdk.java.net/~briangoetz/lambda/collections-overview.html
http://architects.dzone.com/articles/java-collections-api
![Page 77: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/77.jpg)
References* Remove the Permanent Generation
http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals/
http://javaeesupportpatterns.blogspot.com/2011/10/java-7-features-permgen-removal.html
http://java.dzone.com/articles/busting-permgen-myths
https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=5135
* JSR 310: Date and Time API
http://java.dzone.com/articles/introducing-new-date-and-time
http://sourceforge.net/apps/mediawiki/threeten/index.php?title=ThreeTen
http://www.infoq.com/news/2010/03/jsr-310
https://docs.google.com/document/pub?id=1rd8yplQZIRz3LxMzpVLuskr1b0HwBmK9PXpdgBYojSw
http://sourceforge.net/apps/mediawiki/threeten/index.php?title=User_Guide
https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=4350
* General Java8
http://openjdk.java.net/projects/jdk8/features
http://www.pcadvisor.co.uk/news/software/3401314/oracle-java-upgrades-still-worthwhile-despite-postponed-features/
http://dhruba.name/2011/07/06/oracle-discusses-java-7-8-new-features-on-video/
http://channel9.msdn.com/Events/Lang-NEXT/Lang-NEXT-2012/Java-8
http://www.parleys.com/#st=5&id=2850&sl=1
http://www.parleys.com/#st=5&id=2847
https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=2872
https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=10458
![Page 78: Java 8](https://reader031.vdocuments.site/reader031/viewer/2022020306/554ebd8ab4c9053c4b8b4762/html5/thumbnails/78.jpg)
References*Annotations
https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=4469
https://blogs.oracle.com/abuckley/entry/jsr_308_moves_forward
http://jcp.org/en/jsr/detail?id=308
http://openjdk.java.net/jeps/120
http://types.cs.washington.edu/checker-framework/