SlideShare une entreprise Scribd logo
1  sur  177
@JosePaumard
new things we can do with
Java
@JosePaumard
new things we can do with
Java
@JosePaumard
new things we can do with
Java
@JosePaumard#jfokus#50new8
Questions?
#50new8
Date
@JosePaumard#jfokus#50new8
Date: Instant
An Instantisa point on the time line
Instant start = Instant.now() ;
Instant end = Instant.now() ;
@JosePaumard#jfokus#50new8
Date: Duration
A «duration»isthe amount of timebetweeninstants
Instant start = Instant.now() ;
Instant end = Instant.now() ;
Duration elapsed = Duration.between(start, end) ;
long millis = elapsed.toMillis() ;
@JosePaumard#jfokus#50new8
Date: Duration
Thereisan arithmeticon durations
Instant start = Instant.now() ;
Instant end = Instant.now() ;
Duration elapsed = Duration.between(start, end) ;
long millis = elapsed.toMillis() ;
elapsed.plus(2L, ChronoUnit.SECONDS) ;
@JosePaumard#jfokus#50new8
Date: Duration
Theprecisionof the time lineis10-9 s (nanosecond)
@JosePaumard#jfokus#50new8
Date: Duration
Theprecisionof the time lineis10-9 s (nanosecond)
Youthink it’shigh precision?
@JosePaumard#jfokus#50new8
Date: Duration
Theprecisionof the time lineis10-9 s (nanosecond)
Youthink it’shigh precision?
Wellthe l of the
Higgs bosonis10-23 s
@JosePaumard#jfokus#50new8
Date: LocalDate
ALocalDateis an «everyday » date
LocalDate now = LocalDate.now() ;
LocalDate shakespeareDoB =
LocaleDate.of(1564, Month.APRIL, 23) ;
@JosePaumard#jfokus#50new8
Date: Period
A «period»is theamount of time betweenlocal dates
LocalDate now = LocalDate.now() ;
LocalDate shakespeareDoB =
LocaleDate.of(1564, Month.APRIL, 23) ;
Period p = shakespeareDoB.until(now) ;
System.out.println("# years = " + p.getYears()) ;
@JosePaumard#jfokus#50new8
Date: Period
A «period»is theamount of time betweenlocal dates
LocalDate now = LocalDate.now() ;
LocalDate shakespeareDoB =
LocaleDate.of(1564, Month.APRIL, 23) ;
Period p = shakespeareDoB.until(now) ;
System.out.println("# years = " + p.getYears()) ;
long days = shakespeareDoB.until(now, ChronoUnit.DAYS) ;
System.out.println("# days = " + days) ;
@JosePaumard#jfokus#50new8
Date: TemporalAdjuster
Arithmeticwith localdates
LocalDate now = LocalDate.now() ;
LocalDate nextSunday =
now.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)) ;
@JosePaumard#jfokus#50new8
Date: TemporalAdjuster
Arithmeticwith localdates
Atoolboxof 14staticmethods
firstDayOfMonth(),lastDayOfYear()
firstDayOfNextMonth()
LocalDate now = LocalDate.now() ;
LocalDate nextSunday =
now.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)) ;
@JosePaumard#jfokus#50new8
Date: TemporalAdjuster
Arithmeticwith localdates
Atoolboxof 14staticmethods
firstInMonth(DayOfWeek.MONDAY)
next(DayOfWeek.FRIDAY)
LocalDate now = LocalDate.now() ;
LocalDate nextSunday =
now.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)) ;
@JosePaumard#jfokus#50new8
Date: LocalTime
ALocalTimeisan everydaytime: ex. 10:20
LocalTime now = LocalTime.now() ;
LocalTime time = LocalTime.of(10, 20) ; // 10:20
@JosePaumard#jfokus#50new8
Date: LocalTime
ALocalTimeisan everydaytime: ex. 10:20
LocalTime now = LocalTime.now() ;
LocalTime time = LocalTime.of(10, 20) ; // 10:20
LocalTime lunchTime = LocalTime.of(12, 30) ;
LocalTime coffeeTime = lunchTime.plusHours(2) ; // 14:20
@JosePaumard#jfokus#50new8
Date: ZonedTime
Usefulforlocalizedtimes
Set<String> allZonesIds = ZoneId.getAvailableZoneIds() ;
String ukTZ = ZoneId.of("Europe/London") ;
@JosePaumard#jfokus#50new8
Date: ZonedTime
Usefulforlocalizedtimes
System.out.println(
ZonedDateTime.of(
1564, Month.APRIL.getValue(), 23, // year / month / day
10, 0, 0, 0, // h / mn / s / nanos
ZoneId.of("Europe/London"))
); // prints 1564-04-23T10:00-00:01:15[Europe/London]
@JosePaumard#jfokus#50new8
Date: ZonedTime
Arithmeticon localizedtime
ZonedDateTime currentMeeting =
ZonedDateTime.of(
LocalDate.of(2014, Month.APRIL, 18), // LocalDate
LocalTime.of(9, 30), // LocalTime
ZoneId.of("Europe/London")
);
ZonedDateTime nextMeeting =
currentMeeting.plus(Period.ofMonth(1));
@JosePaumard#jfokus#50new8
Date: ZonedTime
Arithmeticon localizedtime
ZonedDateTime currentMeeting =
ZonedDateTime.of(
LocalDate.of(2014, Month.APRIL, 18), // LocalDate
LocalTime.of(9, 30), // LocalTime
ZoneId.of("Europe/London")
);
ZonedDateTime nextMeeting =
currentMeeting.plus(Period.ofMonth(1)) ;
ZonedDateTime nextMeetingUS =
nextMeeting.withZoneSameInstant(ZoneId.of("US/Central")) ;
@JosePaumard#jfokus#50new8
Date: Formatter
Factoryclass:DateTimeFormatter
ZonedDateTime nextMeetingUS =
nextMeeting.withZoneSameInstant(ZoneId.of("US/Central"));
System.out.println(
DateTimeFormatter.ISO_DATE_TIME.format(nextMeetingUS)
);
// prints 2014-04-12T03:30:00-05:00[US/Central]
System.out.println(
DateTimeFormatter.RFC_1123_DATE_TIME.format(nextMeetingUS)
);
// prints Sat, 12 Apr 2014 03:30:00 -0500
@JosePaumard#jfokus#50new8
Date: bridgeswith java.util.Date
Date date = Date.from(instant); // API -> legacy
Instant instant = date.toInstant(); // legacy -> new API
@JosePaumard#jfokus#50new8
Date: bridgeswith java.util.Date
TimeStamp time = TimeStamp.from(instant); // API -> legacy
Instant instant = time.toInstant(); // legacy -> new API
Date date = Date.from(instant); // API -> legacy
Instant instant = date.toInstant(); // legacy -> new API
@JosePaumard#jfokus#50new8
Date: bridgeswith java.util.Date
Date date = Date.from(localDate); // API -> legacy
LocalDate localDate = date.toLocalDate(); // legacy -> new API
TimeStamp time = TimeStamp.from(instant); // API -> legacy
Instant instant = time.toInstant(); // legacy -> new API
Date date = Date.from(instant); // API -> legacy
Instant instant = date.toInstant(); // legacy -> new API
@JosePaumard#jfokus#50new8
Date: bridgeswith java.util.Date
Time time = Time.from(localTime); // API -> legacy
LocalTime localTime = time.toLocalTime(); // legacy -> new API
Date date = Date.from(localDate); // API -> legacy
LocalDate localDate = date.toLocalDate(); // legacy -> new API
TimeStamp time = TimeStamp.from(instant); // API -> legacy
Instant instant = time.toInstant(); // legacy -> new API
Date date = Date.from(instant); // API -> legacy
Instant instant = date.toInstant(); // legacy -> new API
String
@JosePaumard#jfokus#50new8
Building a Streamon a String
Building aStreamon the lettersof a String:
String s = "hello";
IntStream stream = s.chars(); // stream on the letters of s
@JosePaumard#jfokus#50new8
Building a Streamon a String
Building aStreamon the lettersof a String:
String s = "hello";
IntStream stream = s.chars(); // stream on the letters of s
s.chars()
.map(Character::toUpperCase)
.forEach(System.out::println);
@JosePaumard#jfokus#50new8
Building a Streamon a String
Building aStreamon the lettersof a String:
String s = "hello";
IntStream stream = s.chars(); // stream on the letters of s
s.chars()
.map(Character::toUpperCase)
.forEach(System.out::println);
> HELLO7269767679
@JosePaumard#jfokus#50new8
Building a Streamon a String
Building aStreamon the lettersof a String:
String s = "hello";
IntStream stream = s.chars(); // stream on the letters of s
s.chars() // IntStream
.map(Character::toUpperCase)
.forEach(System.out::println); // Prints an int!
> 7269767679
@JosePaumard#jfokus#50new8
Building a Streamon a String
Building aStreamon the lettersof a String:
String s = "hello";
IntStream stream = s.chars(); // stream on the letters of s
s.chars() // IntStream
.mapToObj(letter -> (char)letter) // Stream<Character>
.map(Character::toUpperCase)
.forEach(System.out::println); // Prints a Character
> HELLO
@JosePaumard#jfokus#50new8
String:regularexpressions
Building aStreamfrom a regexp
// book is a looooooooong String
Stream<String> words =
Pattern
.compile("[^p{javaLetter}]")
.splitAsStream(book) ;
@JosePaumard#jfokus#50new8
String:concatenation
Thenewbiewrites:
String s1 = "hello" ;
String s2 = " world!" ;
String s3 = s1 + " " + s2 ;
@JosePaumard#jfokus#50new8
String:concatenation
The ignorant tellshim towrite:
StringBuffer sb1 = new StringBuffer("hello") ;
sb1.append(" world") ;
String s3 = sb1.toString() ;
(andiswrong)
@JosePaumard#jfokus#50new8
String:concatenation
Theseasonneddevtellshim towrite:
StringBuilder sb1 = new StringBuilder("hello") ;
sb1.append(" world") ;
String s3 = sb1.toString() ;
(andiswrong too…)
@JosePaumard#jfokus#50new8
String:concatenation
Becausethe newbieis right (evenif hedoesn’tknow)
String s1 = "hello" ;
String s2 = " world!" ;
String s3 = s1 + " " + s2 ;LINENUMBER 10 L2
NEW java/lang/StringBuilder
DUP
ALOAD 1
INVOKESTATIC java/lang/String.valueOf(Ljava/lang/Object;)Ljava/lang/String;
INVOKESPECIAL java/lang/StringBuilder.<init>(Ljava/lang/String;)V
LDC " "
INVOKEVIRTUAL java/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;
ALOAD 2
INVOKEVIRTUAL java/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString()Ljava/lang/String;
ASTORE 3
@JosePaumard#jfokus#50new8
String:concatenation
The Java8 well-traineddevwrites:
// The JDK 8 way
StringJoiner sj = new StringJoiner(", ") ;
sj.add("one").add("two").add("three") ;
String s = sj.toString() ;
System.out.println(s) ;
@JosePaumard#jfokus#50new8
String:concatenation
The Java8 well-traineddevwrites:
Anditprints:
// The JDK 8 way
StringJoiner sj = new StringJoiner(", ") ;
sj.add("one").add("two").add("three") ;
String s = sj.toString() ;
System.out.println(s) ;
> one, two, three
@JosePaumard#jfokus#50new8
String:concatenation
The Java8 well-traineddevwrites:
Anditprints:
// The JDK 8 way
StringJoiner sj = new StringJoiner(", ") ;
sj.add("one") ;
String s = sj.toString() ;
System.out.println(s) ;
> one
@JosePaumard#jfokus#50new8
String:concatenation
The Java8 well-traineddevwrites:
Anditprints:
// The JDK 8 way
StringJoiner sj = new StringJoiner(", ", "{", "}") ;
sj.add("one").add("two").add("three") ;
String s = sj.toString() ;
System.out.println(s) ;
> {one, two, three}
@JosePaumard#jfokus#50new8
String:concatenation
The Java8 well-traineddevwrites:
Anditprints:
// The JDK 8 way
StringJoiner sj = new StringJoiner(", ", "{", "}") ;
sj.add("one") ;
String s = sj.toString() ;
System.out.println(s) ;
> {one}
@JosePaumard#jfokus#50new8
String:concatenation
The Java8 well-traineddevwrites:
Anditprints:
// The JDK 8 way
StringJoiner sj = new StringJoiner(", ", "{", "}") ;
// we dont put anything in it
String s = sj.toString() ;
System.out.println(s) ;
> {}
@JosePaumard#jfokus#50new8
String:concatenation
Andit’snearlyaccessiblefrom the String classitself:
Anditprints:
// From the String class, with a vararg
String s = String.join(", ", "one", "two", "three");
System.out.println(s);
> one, two, three
@JosePaumard#jfokus#50new8
String:concatenation
Andit’snearlyaccessiblefrom the String classitself:
Anditprints:
// From the String class, with an Iterable
String [] tab = {"one", "two", "three"} ;
String s = String.join(", ", tab) ;
System.out.println(s) ;
> one, two, three
Numbers
@JosePaumard#jfokus#50new8
Numbers:new methods
Methodmax,min, sum
// max method available on number wrapper classes
long max = Long.max(1L, 2L);
long sum = Long.sum(1L, 2L);
@JosePaumard#jfokus#50new8
Numbers:new methods
Methodmax,min, sum
Isit reallythat useful?
// max method available on number wrapper classes
long max = Long.max(1L, 2L);
long sum = Long.sum(1L, 2L);
@JosePaumard#jfokus#50new8
Numbers:new methods
Methodmax,min, sum
Isit reallythat useful?
// max method available on number wrapper classes
long max = Long.max(1L, 2L);
long sum = Long.sum(1L, 2L);
persons.stream()
.map(Person::getAge)
.reduce(0, (a1, a2) -> Integer.max(a1, a2));
@JosePaumard#jfokus#50new8
Numbers:new methods
Methodmax,min, sum
Isit reallythat useful?Nicetowrite methodreferences
// max method available on number wrapper classes
long max = Long.max(1L, 2L);
long sum = Long.sum(1L, 2L);
persons.stream()
.map(Person::getAge)
.reduce(0, Integer::max);
@JosePaumard#jfokus#50new8
Numbers:new methods
Methodmax,min, sum
// max method available on number wrapper classes
long max = Long.max(1L, 2L);
long sum = Long.sum(1L, 2L);
persons.stream()
.mapToInt(Person::getAge)
.max();
@JosePaumard#jfokus#50new8
Numbers:new methods
Methodmax,min, sum
// max method available on number wrapper classes
long max = Long.max(1L, 2L);
long sum = Long.sum(1L, 2L);
persons.stream()
.max(Comparator.comparingBy(Person::getAge));
@JosePaumard#jfokus#50new8
Numbers:new methods
Hashcodecomputation
// JDK 7
long l = 3141592653589793238L;
int hash = new Long(l).hashCode(); // -1985256439
@JosePaumard#jfokus#50new8
Numbers:new methods
Hashcodecomputation
// JDK 7
long l = 3141592653589793238L;
int hash = new Long(l).hashCode(); // -1985256439
// JDK 8
long l = 3141592653589793238L;
int hash = Long.hashCode(l); // -1985256439
I/O
@JosePaumard#jfokus#50new8
I/O:readingtext files
StreamextendsAutoCloseable
// Java 7 : try with resources and use of Paths
Path path = Paths.get("d:", "tmp", "debug.log");
try (Stream<String> stream = Files.lines(path)) {
stream.filter(line -> line.contains("ERROR"))
.findFirst()
.ifPresent(System.out::println);
} catch (IOException ioe) {
// handle the exception
}
@JosePaumard#jfokus#50new8
I/O:readingtext files
Files.listreturnsthe content ofthe directory
// Java 7 : try with resources and use of Paths
Path path = Paths.get("c:", "windows");
try (Stream<Path> stream = Files.list(path)) {
stream.filter(path -> path.toFile().isDirectory())
.forEach(System.out::println);
} catch (IOException ioe) {
// handle the exception
}
@JosePaumard#jfokus#50new8
I/O:readinga tree of subdirs
Files.walkreturns the contentof the subtree
// Java 7 : try with resources and use of Paths
Path path = Paths.get("c:", "windows");
try (Stream<Path> stream = Files.walk(path)) {
stream.filter(path -> path.toFile().isDirectory())
.forEach(System.out::println);
} catch (IOException ioe) {
// handle the exception
}
@JosePaumard#jfokus#50new8
I/O:readinga tree of subdirs
Files.walkcan limitthe depthof exploration
// Java 7 : try with resources and use of Paths
Path path = Paths.get("c:", "windows");
try (Stream<Path> stream = Files.walk(path, 2)) {
stream.filter(path -> path.toFile().isDirectory())
.forEach(System.out::println);
} catch (IOException ioe) {
// handle the exception
}
List
@JosePaumard#jfokus#50new8
Iterable:forEach
ForEach: consumesthe elements
Doesn’tworkon arrays
// method forEach defined on Iterable
List<String> strings =
Arrays.asList("one", "two", "three") ;
strings.forEach(System.out::println) ;
> one, two, three
@JosePaumard#jfokus#50new8
Collection:removeIf
Removesanobject,takesaPredicate
Collection<String> strings =
Arrays.asList("one", "two", "three", "four");
// works « in place », no Collections.unmodifiable...
Collection<String> list = new ArrayList<>(strings);
// returns true if the list has been modified
boolean b = list.removeIf(s -> s.length() > 4);
> one, two, four
@JosePaumard#jfokus#50new8
List: replaceAll
Replacesan objectwith its transform
List<String> strings =
Arrays.asList("one", "two", "three", "four");
// works « in place », no Collections.unmodifiable...
List<String> list = new ArrayList<>(strings);
// returns nothing
list.replaceAll(String::toUpperCase);
> ONE, TWO, THREE, FOUR
@JosePaumard#jfokus#50new8
List: sort
Sorts aList in place,takesaComparator
List<String> strings =
Arrays.asList("one", "two", "three", "four");
// works « in place », no Collections.unmodifiable...
List<String> list = new ArrayList<>(strings);
// returns nothing
list.sort(Comparator.naturalOrder()) ;
> four, one, three, two
Comparator
@JosePaumard#jfokus#50new8
Comparator!
What else?
Comparator.naturalOrder() ;
@JosePaumard#jfokus#50new8
Comparator!
What else?
Comparator.naturalOrder()
public static
<T extends Comparable<? super T>> Comparator<T> naturalOrder() {
return (Comparator<T>)
Comparators.NaturalOrderComparator.INSTANCE;
}
@JosePaumard#jfokus#50new8
Comparator!
enum NaturalOrderComparator
implements Comparator<Comparable<Object>> {
INSTANCE; // What is this???
}
@JosePaumard#jfokus#50new8
Comparator!
enum NaturalOrderComparator
implements Comparator<Comparable<Object>> {
INSTANCE; // OMG: a SINGLETON!!!
}
public class MySingleton {
INSTANCE;
private MySingleton() {}
public static MySingleton getInstance() {
// some buggy double-checked locking code
return INSTANCE;
}
}
@JosePaumard#jfokus#50new8
Comparator!
enum NaturalOrderComparator
implements Comparator<Comparable<Object>> {
INSTANCE;
public int compare(Comparable<Object> c1, Comparable<Object> c2) {
return c1.compareTo(c2);
}
}
@JosePaumard#jfokus#50new8
Comparator!
enum NaturalOrderComparator
implements Comparator<Comparable<Object>> {
INSTANCE;
public int compare(Comparable<Object> c1, Comparable<Object> c2) {
return c1.compareTo(c2);
}
public Comparator<Comparable<Object>> reversed() {
return Comparator.reverseOrder();
}
}
@JosePaumard#jfokus#50new8
The goodol’ way!
Comparator!
// comparison using the last name
Comparator<Person> compareLastName =
new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
return p1.getLastName().compareTo(p2.getLastName());
}
};
@JosePaumard#jfokus#50new8
Comparator!
// comparison using the last name then the first name
Comparator<Person> compareLastNameThenFirstName =
new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
int lastNameComparison =
p1.getLastName().compareTo(p2.getLastName());
return lastNameComparison == 0 ?
p2.getFirstName().compareTo(p2.getFirstName());
lastNameComparison;
}
};
@JosePaumard#jfokus#50new8
Comparator!
The JDK 8 way!
Comparator.comparingBy(Person::getLastName); // static method
@JosePaumard#jfokus#50new8
Comparator!
The JDK 8 way!
Comparator.comparingBy(Person::getLastName) // static method
.thenComparing(Person::getFirstName); // default method
@JosePaumard#jfokus#50new8
Comparator!
The JDK 8 way!
Comparator.comparingBy(Person::getLastName) // static method
.thenComparing(Person::getFirstName) // default method
.thenComparing(Person::getAge);
@JosePaumard#jfokus#50new8
Comparator!
Dontlikethe natural order?
Comparator<Person> comp = Comparator.naturalOrder();
Comparator<Person> reversedComp = Comparator.reversedOrder();
@JosePaumard#jfokus#50new8
Comparator!
Dontlikethe natural order?
Comparator<Person> comp = Comparator.comparingBy(Person::getLastName);
Comparator<Person> reversedComp = comp.reversed();
@JosePaumard#jfokus#50new8
Comparator!
Andwhat aboutnullvalues?
Comparator<Person> comp =
Comparator.naturalOrder();
@JosePaumard#jfokus#50new8
Comparator!
Andwhat aboutnullvalues?
Comparator<Person> comp =
Comparator.nullsFirst(Comparator.naturalOrder());
@JosePaumard#jfokus#50new8
Comparator!
Andwhat aboutnullvalues?
Comparator<Person> comp =
Comparator.nullsFirst(Comparator.naturalOrder());
Comparator<Person> comp =
Comparator.nullsLast(Comparator.naturalOrder());
Optional
@JosePaumard#jfokus#50new8
Optional
Optionalhas beencreatedto tellthat this methodcouldreturn « no value»
Ex: max(),min()
@JosePaumard#jfokus#50new8
Optional
Optionalhas beencreatedto tellthat this methodcouldreturn « no value»
Ex: max(),min(), average()
@JosePaumard#jfokus#50new8
Optional
An Optionalisa wrappingtype,that can beempty
HowcanIbuildone?
Optional<String> opt = Optional.<String>empty() ;
Optional<String> opt = Optional.of("one") ; // not null
Optional<String> opt = Optional.ofNullable(s) ; // may be null
@JosePaumard#jfokus#50new8
Optional
An Optionalisa wrappingtype,that can beempty
HowcanI useit?
Optional<String> opt = ... ;
if (opt.isPresent()) {
String s = opt.get() ;
} else {
...
}
@JosePaumard#jfokus#50new8
Optional
An Optionalisa wrappingtype,that can beempty
HowcanI useit?
String s = opt.orElse("") ; // this is a default value that
// is valid for our application
Optional<String> opt = ... ;
if (opt.isPresent()) {
String s = opt.get() ;
} else {
...
}
@JosePaumard#jfokus#50new8
Optional
An Optionalisa wrappingtype,that can beempty
HowcanI useit?
String s = opt.orElseThrow(MyException::new) ; // lazy initialization
@JosePaumard#jfokus#50new8
Optional:more patterns
An Optionalcanbe seenas aspecialStream
with zeroor oneelement
void ifPresent(Consumer<T> consumer) ;
@JosePaumard#jfokus#50new8
Optional:more patterns
An Optionalcanbe seenas aspecialStream
with zeroor oneelement
void ifPresent(Consumer<T> consumer) ;
Optional<T> filter(Predicate<T> mapper) ;
@JosePaumard#jfokus#50new8
Optional:more patterns
An Optionalcanbe seenas aspecialStream
with zeroor oneelement
void ifPresent(Consumer<T> consumer) ;
Optional<T> filter(Predicate<T> mapper) ;
Optional<U> map(Function<T, U> mapper) ;
@JosePaumard#jfokus#50new8
Optional:more patterns
An Optionalcanbe seenas aspecialStream
with zeroor oneelement
void ifPresent(Consumer<T> consumer) ;
Optional<T> filter(Predicate<T> mapper) ;
Optional<U> map(Function<T, U> mapper) ;
Optional<U> flatMap(Function<T, Optional<U>> mapper) ;
@JosePaumard#jfokus#50new8
Optional:new patternssighted!
public class NewMath {
public static Optional<Double> inv(Double d) {
return d == 0.0d ? Optional.empty() :
Optional.of(1/d) ;
}
public static Optional<Double> sqrt(Double d) {
return d < 0.0d ? Optional.empty() :
Optional.of(Math.sqrt(d)) ;
}
}
@JosePaumard#jfokus#50new8
Optional:new patternssighted!
List<Double> doubles = Arrays.asList(-1d, 0d, 1d) ;
List<Double> result = new ArrayList<>() ;
doubles.forEach(
d1 -> NewMath.inv(d1) // Optional<Double>
.flatMap(d2 -> NewMath.sqrt(d2)) // Optional<Double>
.ifPresent(result::add)
) ;
doubles : [-1.0, 0.0, 1.0]
result : [1.0]
@JosePaumard#jfokus#50new8
Optional:new patternssighted!
List<Double> doubles = Arrays.asList(-1d, 0d, 1d) ;
List<Double> result = new ArrayList<>() ;
doubles.forEach(
d1 -> NewMath.inv(d1) // Optional<Double>
.flatMap(d2 -> NewMath.sqrt(d2)) // Optional<Double>
.ifPresent(result::add)
) ;
doubles : [-1.0, 0.0, 1.0]
result : [1.0]
@JosePaumard#jfokus#50new8
Optional:new patternssighted!
List<Double> doubles = Arrays.asList(-1d, 0d, 1d) ;
List<Double> result = new ArrayList<>() ;
doubles.forEach(
d1 -> NewMath.inv(d1) // Optional<Double>
.flatMap(d2 -> NewMath.sqrt(d2)) // Optional<Double>
.ifPresent(result::add) // Baaaaad pattern 
) ;
doubles : [-1.0, 0.0, 1.0]
result : [1.0]
@JosePaumard#jfokus#50new8
Optional:new patternssighted!
Function<Double, Optional<Double>> f =
d -> NewMath.inv(d) // Optional<Double>
.flatMap(d -> NewMath.sqrt(d))// Optional<Double>
@JosePaumard#jfokus#50new8
Optional:new patternssighted!
d -> NewMath.inv(d) // Optional<Double>
.flatMap(NewMath::sqrt) // Optional<Double>
.map(Stream::of) // Optional<Stream<Double>>
@JosePaumard#jfokus#50new8
Optional:new patternssighted!
d -> NewMath.inv(d) // Optional<Double>
.flatMap(NewMath::sqrt) // Optional<Double>
.map(Stream::of) // Optional<Stream<Double>>
.orElse(Stream.empty()) // Stream<Double>
@JosePaumard#jfokus#50new8
Optional:new patternssighted!
Function<Double, Stream<Double>> f =
d -> NewMath.inv(d) // Optional<Double>
.flatMap(NewMath::sqrt) // Optional<Double>
.map(Stream::of) // Optional<Stream<Double>>
.orElse(Stream.empty()) ; // Stream<Double>
@JosePaumard#jfokus#50new8
Optional:new patternssighted!
List<Double> doubles = Arrays.asList(-1d, 0d, 1d) ;
List<Double> result = new ArrayList<>() ;
doubles.stream()
.flatMap(
d -> NewMath.inv(d) // Optional<Double>
.flatMap(NewMath::sqrt) // Optional<Double>
.map(Stream::of) // Optional<Stream<Double>>
.orElse(Stream.empty()) // Stream<Double>
) // Stream<Double>
@JosePaumard#jfokus#50new8
Optional:new patternssighted!
List<Double> doubles = Arrays.asList(-1d, 0d, 1d) ;
List<Double> result = new ArrayList<>() ;
doubles.stream()
.flatMap(
d -> NewMath.inv(d) // Optional<Double>
.flatMap(NewMath::sqrt) // Optional<Double>
.map(Stream::of) // Optional<Stream<Double>>
.orElse(Stream.empty()) // Stream<Double>
) // Stream<Double>
.collect(Collectors.toList()) ;
@JosePaumard#jfokus#50new8
Optional:new patternssighted!
List<Double> doubles = Arrays.asList(-1d, 0d, 1d) ;
List<Double> result = new ArrayList<>() ;
doubles.stream().parallel()
.flatMap(
d -> NewMath.inv(d) // Optional<Double>
.flatMap(NewMath::sqrt) // Optional<Double>
.map(Stream::of) // Optional<Stream<Double>>
.orElse(Stream.empty()) // Stream<Double>
) // Stream<Double>
.collect(Collectors.toList()) ;
Map
@JosePaumard#jfokus#50new8
Map:forEach
TakesaBiConsumer
// the existing map
Map<String, Person> map = ... ;
map.forEach(
(key, value) -> System.out.println(key + " -> " + value)
) ;
@JosePaumard#jfokus#50new8
Map:get
What happensif keyisnot in themap?
// the existing map
Map<String, Person> map = ... ;
Person p = map.get(key);
@JosePaumard#jfokus#50new8
Map:get
// the existing map
Map<String, Person> map = ... ;
Person p = map.getOrDefault(key, Person.DEFAULT_PERSON);
@JosePaumard#jfokus#50new8
Map: put
// the existing map
Map<String, Person> map = ... ;
map.put(key, person);
@JosePaumard#jfokus#50new8
Map:putIfAbsent
// the existing map
Map<String, Person> map = ... ;
map.put(key, person);
map.putIfAbsent(key, person);
@JosePaumard#jfokus#50new8
Map: replace
Replacesa valuefrom its key
// the existing map
Map<String, Person> map = ... ;
// key, newValue
map.replace("six", john) ;
// key, oldValue, newValue
map.replace("six", peter, john) ;
@JosePaumard#jfokus#50new8
Map:replaceAll
Replacesall the valuesfrom the map,using al
// the existing map
Map<String, Person> map = ... ;
// key, oldValue
map.replaceAll(
(key, value) -> key + " -> " + value ;
) ;
@JosePaumard#jfokus#50new8
Map:remove
Removesa key/ valuepair if it’s there
// the existing map
Map<String, Person> map = ... ;
// key, oldValue
map.remove("six", john) ;
@JosePaumard#jfokus#50new8
Map:compute
Computesa valuefrom theexisting key/ valuepair
and al
// the existing map
Map<String, Person> map = ... ;
// key, oldValue
map.compute(
key,
(key, person) -> key + "::" + person // person can be null
) ;
@JosePaumard#jfokus#50new8
Map:computeIfAbsent
Computesa valuefrom a keythat isnot in themap
// the existing map
Map<String, Person> map = ... ;
// key, no existing value
map.computeIfAbsent(
key,
key -> person
) ;
@JosePaumard#jfokus#50new8
Map:computeIfPresent
Computesa valuefrom theexisting key/ valuepair
and al
// the existing map
Map<String, Person> map = ... ;
// key, the existing value
map.computeIfPresent(
key, person,
(key, person) -> newPerson // person cannot be null
) ;
@JosePaumard#jfokus#50new8
Map:compute*
The trick is: thesemethodsreturnthe value,whetheritwas there ofjust created
@JosePaumard#jfokus#50new8
Buildingmapsof maps
Makingmapsof mapsbecomessoooeasy!
// the existing map
Map<String, Map<String, Person>> map = ... ;
// key, newValue
map.computeIfAbsent(
"one",
(key) -> HashMap::new
).put("two", john);
@JosePaumard#jfokus#50new8
Map:merge
Computesthe new valuefrom theexisting value,the newly addedvalueand a l
// the existing map
Map<Long, String> map = ... ;
// key, otherValue
map.merge(
key,
otherValue,
(value, otherValue) -> String.join(", ", value, otherValue)
) ;
Annotation
s
@JosePaumard#jfokus#50new8
Annotations in Java 7
Wrappingannotations
An annotationcannotbeappliedmorethan once
@TestCases({
@TestCase(param=1, expected=false),
@TestCase(param=2, expected=true)
})
public boolean even(int param) {
return param % 2 == 0;
}
@JosePaumard#jfokus#50new8
Annotations in Java 8
Java8 makesit possible!
@TestCase(param=1, expected=false),
@TestCase(param=2, expected=true)
public boolean even(int param) {
return param % 2 == 0;
}
@JosePaumard#jfokus#50new8
How does it work?
It’s a trick!
@JosePaumard#jfokus#50new8
How does it work?
First: createtheannotations asusual
@interface TestCase {
int param();
boolean expected();
}
@interface TestCases {
TestCase[] value();
}
@JosePaumard#jfokus#50new8
How does it work?
Second:maketheannotationrepeatable
@Repeatable(TestCases.class)
@interface TestCase {
int param();
boolean expected();
}
@interface TestCases {
TestCase[] value();
}
@JosePaumard#jfokus#50new8
Type annotations
Annotationscanbenowput on types
Example1: tellthat a variableshould notbenull
private @NonNull List<Person> persons = ... ;
@JosePaumard#jfokus#50new8
Type annotations
Annotationscanbenowput on types
Example1: tellthat a variableshould notbenull
Example2: the contentshouldnot benullneither
private @NonNull List<Person> persons = ... ;
private @NonNull List<@NonNull Person> persons = ... ;
Arrays
Parallel
@JosePaumard#jfokus#50new8
ParallelArrays
Arrays.parallelSetAll
long [] array = new long [...] ;
Arrays.parallelSetAll(array, index -> index % 3) ;
System.out.println(Arrays.toString(array)) ;
@JosePaumard#jfokus#50new8
ParallelArrays
Arrays.parallelPrefix:foldright
long [] array = new long [...] ;
Arrays.parallelPrefix(array, (l1, l2) -> l1 + l2) ;
System.out.println(Arrays.toString(array)) ;
long [] array = {1L, 1L, 1L, 1L} ;
> [1, 2, 3, 4]
@JosePaumard#jfokus#50new8
ParallelArrays
Arrays.parallelSort:in placesorting
long [] array = new long [...] ;
Arrays.parallelSort(array) ;
System.out.println(Arrays.toString(array)) ;
Completable
Future
@JosePaumard#jfokus#50new8
CompletableFuture
Extension ofFuture
CompletableFuture<String> page =
CompletableFuture.supplyAsync(
) ;
@JosePaumard#jfokus#50new8
CompletableFuture
Extension ofFuture
CompletableFuture<String> page =
CompletableFuture.supplyAsync(
() ->
readWebPage(url) // returns String
) ;
@JosePaumard#jfokus#50new8
CompletableFuture
Nowwe cancreatepipelines
CompletableFuture.supplyAsync(
() ->
readWebPage(url)
)
.thenApply(
content -> getImages(content) // returns a List<Image>
) ; // returns a CompletableFuture<List<Image>>
@JosePaumard#jfokus#50new8
CompletableFuture
Nowwe cancreatepipelines
CompletableFuture.supplyAsync(
() ->
readWebPage(url)
)
.thenApply(
content -> getImages(content) // returns a List<Image>
)
.thenAccept(
images -> images.forEach(System.out::println)
);
@JosePaumard#jfokus#50new8
CompletableFuture
thenCompose():doesnot wrapthe result ina CF
CompletableFuture.supplyAsync(
() ->
readWebPage(url)
)
.thenCompose(
content -> getImages(content) // returns List<Image>
)
@JosePaumard#jfokus#50new8
CompletableFuture
allOf:returns whenall thetasks aredone(seealsoanyOf)
CompletableFuture.allOf(
CompletableFuture.supplyAsync(
() ->
readWebPage(url)
)
.thenCompose(content -> getImages(content))
.thenApply(image -> writeToDisk(image))
)
.join() ;
@JosePaumard#jfokus#50new8
CompletableFuture
thenCombine:can combinemorethan one CF
Thelis appliedonce thetwo CF havecompleted
CompletableFuture cf1 = ... ;
CompletableFuture cf2 = ... ;
cf1.thenCombine(cf2, (b1, b2) -> b1 & b2) ; // can combine
// the results of CFs
@JosePaumard#jfokus#50new8
CompletableFuture
thenCombine:can combinemorethan one CF
Thelis appliedonce thetwo CF havecompleted
Also:thenAcceptBoth,runAfterBoth
CompletableFuture cf1 = ... ;
CompletableFuture cf2 = ... ;
cf1.thenCombine(cf2, (b1, b2) -> b1 & b2) ; // can combine
// the results of CFs
@JosePaumard#jfokus#50new8
CompletableFuture
applyToEither:takesthe first availableresult
CompletableFuture cf1 = ... ;
CompletableFuture cf2 = ... ;
cf1.applyToEither(cf2, (b) -> ...) ; // applies to the first
// CF that returns
@JosePaumard#jfokus#50new8
CompletableFuture
applyToEither:takesthe first availableresult
acceptEither,runAfterEither
CompletableFuture cf1 = ... ;
CompletableFuture cf2 = ... ;
cf1.applyToEither(cf2, (b) -> ...) ; // applies to the first
// CF that returns
Concurrenc
e
@JosePaumard#jfokus#50new8
Atomic variables
From Java5:
AtomicLong atomic = new AtomicLong() ;
long l1 = atomic.incrementAndGet() ;
@JosePaumard#jfokus#50new8
Atomic variables
Java8 brings:
AtomicLong atomic = new AtomicLong() ;
long l1 = atomic.incrementAndGet() ;
long l2 = atomic.updateAndGet(l -> l*2 + 1) ;
@JosePaumard#jfokus#50new8
Atomic variables
Java8 brings:
AtomicLong atomic = new AtomicLong() ;
long l1 = atomic.incrementAndGet() ;
long l2 = atomic.updateAndGet(l -> l*2 + 1) ;
long l3 = atomic.accumulateAndGet(12L, (l1, l2) -> l1 % l2) ;
@JosePaumard#jfokus#50new8
LongAdder
From Java8:
LongAdder adder = new LongAdder() ;
adder.increment() ; // in a thread
adder.increment() ; // in a 2nd thread
adder.increment() ; // in a 3rd thread
long sum = adder.sum() ;
@JosePaumard#jfokus#50new8
LongAccumulator
Samething, withl:
LongAccumulator accu =
new LongAccumulator((l1, l2) -> Long.max(l1, l2), 0L) ;
accu.accumulate(value1) ; // in a thread
accu.accumulate(value2) ; // in a 2nd thread
accu.accumulate(value2) ; // in a 3rd thread
long sum = accu.longValue() ;
@JosePaumard#jfokus#50new8
StampedLock
Aregularlock,withoptimisticread
long stamp = sl.writeLock() ;
try {
...
} finally {
sl.unlockWrite(stamp) ;
}
long stamp = sl.readLock() ;
try {
...
} finally {
sl.unlockRead(stamp) ;
}
StampedLock sl= new StampedLock() ;
@JosePaumard#jfokus#50new8
StampedLock
Aregularlock,withoptimisticread
Exclusiveread/ write,but…
long stamp = sl.writeLock() ;
try {
...
} finally {
sl.unlockWrite(stamp) ;
}
long stamp = sl.readLock() ;
try {
...
} finally {
sl.unlockRead(stamp) ;
}
StampedLock sl= new StampedLock() ;
@JosePaumard#jfokus#50new8
StampedLock
Aregularlock,withoptimisticread
StampedLock sl= new StampedLock() ;
long stamp = sl.tryOptimisticRead() ;
// here we read a variable that can be changed in another thread
if (lock.validate(stamp)) {
// the read was not concurrent
} else {
// another thread acquired a write lock
}
Concurren
t
Concurren
tHashMap
@JosePaumard#jfokus#50new8
ConcurrentHashMap
TheoldConcurrentHashMapV7 has beenremoved
Threadsafe
Nolocking≠ConcurrentHashMapV7
Newmethods(alot…)
@JosePaumard#jfokus#50new8
ConcurrentHashMap
6000 linesof code
@JosePaumard#jfokus#50new8
ConcurrentHashMap
6000 linesof code
54 memberclasses
@JosePaumard#jfokus#50new8
ConcurrentHashMap
6000 linesof code
54 memberclasses
FYI: 58 classesin java.util.concurrent
@JosePaumard#jfokus#50new8
ConcurrentHashMap
6000 linesof code
54 memberclasses
FYI: 58 classesin java.util.concurrent
New patterns!
@JosePaumard#jfokus#50new8
ConcurrentHashMap
Forget aboutsize()
int count = map.size() ; // should not be used
count = map.mappingCount() ; // new method
@JosePaumard#jfokus#50new8
ConcurrentHashMap
Forget aboutsize()
int count = map.size() ; // should not be used
long count = map.mappingCount() ; // new method
@JosePaumard#jfokus#50new8
ConcurrentHashMap
Search()method
search(),searchKey(),searchValue(),searchEntry()
Returnsthe 1st elementthat matches the predicate
ConcurrentHashMap<Integer, String> map = ... ;
map.search(10L, (key, value) -> value.length() < key) ;
@JosePaumard#jfokus#50new8
ConcurrentHashMap
Search()method
search(),searchKey(),searchValue(),searchEntry()
Returnsthe 1st elementthat matches the predicate
ConcurrentHashMap<Integer, String> map = ... ;
map.search(10L, (key, value) -> value.length() < key) ;
@JosePaumard#jfokus#50new8
ConcurrentHashMap
Search()method
Ifthere aremore than 10 elements,then thesearchwillbe conductedinparallel!
ConcurrentHashMap<Integer, String> map = ... ;
map.search(10L, (key, value) -> value.length() < key) ;
@JosePaumard#jfokus#50new8
ConcurrentHashMap
Search()method
Ifthere aremore than 10 elements,then thesearchwillbe conductedinparallel!
Onecanpass0 or Long.MAX_VALUE
ConcurrentHashMap<Integer, String> map = ... ;
map.search(10L, (key, value) -> value.length() < key) ;
@JosePaumard#jfokus#50new8
ConcurrentHashMap
ForEach
forEach(),forEachKey(),forEachEntries()
ConcurrentHashMap<Integer, String> map = ... ;
map.forEach(10L,
(key, value) ->
System.out.println(String.join(key, "->", value)
) ;
@JosePaumard#jfokus#50new8
ConcurrentHashMap
Reduction
reduce(),reduceKey(),reduceEntries()
ConcurrentHashMap<Integer, String> map = ... ;
map.reduce(10L,
(key, value) -> value.getName(), // transformation
(name1, name2) -> name1.length() > name2.length() ?
name1 : name2) // reduction
) ;
@JosePaumard#jfokus#50new8
No ConcurrentHashSet
But…
Set<String> set = ConcurrentHashMap.newKeySet() ;
@JosePaumard#jfokus#50new8
No ConcurrentHashSet
But…
Createsaconcurrenthashmapin which thevaluesare Boolean.TRUE
Actsas a concurrentset
Set<String> set = ConcurrentHashMap.newKeySet() ;
Thank you!
@JosePaumard
#50new8

Contenu connexe

Tendances

Java 8, Streams & Collectors, patterns, performances and parallelization
Java 8, Streams & Collectors, patterns, performances and parallelizationJava 8, Streams & Collectors, patterns, performances and parallelization
Java 8, Streams & Collectors, patterns, performances and parallelizationJosé Paumard
 
Going reactive in java
Going reactive in javaGoing reactive in java
Going reactive in javaJosé Paumard
 
Java 8 Streams and Rx Java Comparison
Java 8 Streams and Rx Java ComparisonJava 8 Streams and Rx Java Comparison
Java 8 Streams and Rx Java ComparisonJosé Paumard
 
The Sincerest Form of Flattery
The Sincerest Form of FlatteryThe Sincerest Form of Flattery
The Sincerest Form of FlatteryJosé Paumard
 
The Sincerest Form of Flattery
The Sincerest Form of FlatteryThe Sincerest Form of Flattery
The Sincerest Form of FlatteryJosé Paumard
 
Java 8 Stream API and RxJava Comparison
Java 8 Stream API and RxJava ComparisonJava 8 Stream API and RxJava Comparison
Java 8 Stream API and RxJava ComparisonJosé Paumard
 
Autumn collection JavaOne 2014
Autumn collection JavaOne 2014Autumn collection JavaOne 2014
Autumn collection JavaOne 2014José Paumard
 
Linked to ArrayList: the full story
Linked to ArrayList: the full storyLinked to ArrayList: the full story
Linked to ArrayList: the full storyJosé Paumard
 
Collectors in the Wild
Collectors in the WildCollectors in the Wild
Collectors in the WildJosé Paumard
 
Lean & Mean Tokyo Cabinet Recipes (with Lua) - FutureRuby '09
Lean & Mean Tokyo Cabinet Recipes (with Lua) - FutureRuby '09Lean & Mean Tokyo Cabinet Recipes (with Lua) - FutureRuby '09
Lean & Mean Tokyo Cabinet Recipes (with Lua) - FutureRuby '09Ilya Grigorik
 
Java Boilerplate Busters
Java Boilerplate BustersJava Boilerplate Busters
Java Boilerplate BustersHamletDRC
 
using python module: doctest
using python module: doctestusing python module: doctest
using python module: doctestmitnk
 
Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.David Gómez García
 
Ast transformations
Ast transformationsAst transformations
Ast transformationsHamletDRC
 
AST Transformations
AST TransformationsAST Transformations
AST TransformationsHamletDRC
 
Building native Android applications with Mirah and Pindah
Building native Android applications with Mirah and PindahBuilding native Android applications with Mirah and Pindah
Building native Android applications with Mirah and PindahNick Plante
 
Design Patterns - Compiler Case Study - Hands-on Examples
Design Patterns - Compiler Case Study - Hands-on ExamplesDesign Patterns - Compiler Case Study - Hands-on Examples
Design Patterns - Compiler Case Study - Hands-on ExamplesGanesh Samarthyam
 

Tendances (20)

Java 8, Streams & Collectors, patterns, performances and parallelization
Java 8, Streams & Collectors, patterns, performances and parallelizationJava 8, Streams & Collectors, patterns, performances and parallelization
Java 8, Streams & Collectors, patterns, performances and parallelization
 
Going reactive in java
Going reactive in javaGoing reactive in java
Going reactive in java
 
Java 8 Streams and Rx Java Comparison
Java 8 Streams and Rx Java ComparisonJava 8 Streams and Rx Java Comparison
Java 8 Streams and Rx Java Comparison
 
Free your lambdas
Free your lambdasFree your lambdas
Free your lambdas
 
The Sincerest Form of Flattery
The Sincerest Form of FlatteryThe Sincerest Form of Flattery
The Sincerest Form of Flattery
 
The Sincerest Form of Flattery
The Sincerest Form of FlatteryThe Sincerest Form of Flattery
The Sincerest Form of Flattery
 
Java 8 Stream API and RxJava Comparison
Java 8 Stream API and RxJava ComparisonJava 8 Stream API and RxJava Comparison
Java 8 Stream API and RxJava Comparison
 
Java Full Throttle
Java Full ThrottleJava Full Throttle
Java Full Throttle
 
Autumn collection JavaOne 2014
Autumn collection JavaOne 2014Autumn collection JavaOne 2014
Autumn collection JavaOne 2014
 
Linked to ArrayList: the full story
Linked to ArrayList: the full storyLinked to ArrayList: the full story
Linked to ArrayList: the full story
 
Collectors in the Wild
Collectors in the WildCollectors in the Wild
Collectors in the Wild
 
Lean & Mean Tokyo Cabinet Recipes (with Lua) - FutureRuby '09
Lean & Mean Tokyo Cabinet Recipes (with Lua) - FutureRuby '09Lean & Mean Tokyo Cabinet Recipes (with Lua) - FutureRuby '09
Lean & Mean Tokyo Cabinet Recipes (with Lua) - FutureRuby '09
 
Java Boilerplate Busters
Java Boilerplate BustersJava Boilerplate Busters
Java Boilerplate Busters
 
using python module: doctest
using python module: doctestusing python module: doctest
using python module: doctest
 
Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.
 
Ast transformations
Ast transformationsAst transformations
Ast transformations
 
AST Transformations
AST TransformationsAST Transformations
AST Transformations
 
Building native Android applications with Mirah and Pindah
Building native Android applications with Mirah and PindahBuilding native Android applications with Mirah and Pindah
Building native Android applications with Mirah and Pindah
 
Core Java - Quiz Questions - Bug Hunt
Core Java - Quiz Questions - Bug HuntCore Java - Quiz Questions - Bug Hunt
Core Java - Quiz Questions - Bug Hunt
 
Design Patterns - Compiler Case Study - Hands-on Examples
Design Patterns - Compiler Case Study - Hands-on ExamplesDesign Patterns - Compiler Case Study - Hands-on Examples
Design Patterns - Compiler Case Study - Hands-on Examples
 

En vedette

50 nouvelles choses que l'on peut faire en Java 8
50 nouvelles choses que l'on peut faire en Java 850 nouvelles choses que l'on peut faire en Java 8
50 nouvelles choses que l'on peut faire en Java 8José Paumard
 
ArrayList et LinkedList sont dans un bateau
ArrayList et LinkedList sont dans un bateauArrayList et LinkedList sont dans un bateau
ArrayList et LinkedList sont dans un bateauJosé Paumard
 
Java SE 8 for Java EE developers
Java SE 8 for Java EE developersJava SE 8 for Java EE developers
Java SE 8 for Java EE developersJosé Paumard
 
Déploiement d'une application Java EE dans Azure
Déploiement d'une application Java EE dans AzureDéploiement d'une application Java EE dans Azure
Déploiement d'une application Java EE dans AzureJosé Paumard
 
Async Gateway или Разработка системы распределенных вычислений с нуля
Async Gateway или Разработка системы распределенных вычислений с нуляAsync Gateway или Разработка системы распределенных вычислений с нуля
Async Gateway или Разработка системы распределенных вычислений с нуляVitebsk Miniq
 
Hazelcast and MongoDB at Cloud CMS
Hazelcast and MongoDB at Cloud CMSHazelcast and MongoDB at Cloud CMS
Hazelcast and MongoDB at Cloud CMSuzquiano
 
Phoenix for Rubyists
Phoenix for RubyistsPhoenix for Rubyists
Phoenix for RubyistsMike North
 
HighLoad++ 2009 In-Memory Data Grids
HighLoad++ 2009 In-Memory Data GridsHighLoad++ 2009 In-Memory Data Grids
HighLoad++ 2009 In-Memory Data GridsAlexey Kharlamov
 
Алексей Николаенков, Devexperts
Алексей Николаенков, DevexpertsАлексей Николаенков, Devexperts
Алексей Николаенков, DevexpertsNata_Churda
 
Hazelcast for Terracotta Users
Hazelcast for Terracotta UsersHazelcast for Terracotta Users
Hazelcast for Terracotta UsersHazelcast
 
Amazon cloud – готовим вместе
Amazon cloud – готовим вместеAmazon cloud – готовим вместе
Amazon cloud – готовим вместеVitebsk Miniq
 
Gamification in outsourcing company: experience report.
Gamification in outsourcing company: experience report.Gamification in outsourcing company: experience report.
Gamification in outsourcing company: experience report.Mikalai Alimenkou
 
Очень вкусный фрукт Guava
Очень вкусный фрукт GuavaОчень вкусный фрукт Guava
Очень вкусный фрукт GuavaEgor Chernyshev
 
Java 8, the Good, the Bad and the Ugly
Java 8, the Good, the Bad and the UglyJava 8, the Good, the Bad and the Ugly
Java 8, the Good, the Bad and the UglyMikalai Alimenkou
 
Hibernate performance tuning
Hibernate performance tuningHibernate performance tuning
Hibernate performance tuningMikalai Alimenkou
 
Maven 3 : уличная магия
Maven 3 : уличная магияMaven 3 : уличная магия
Maven 3 : уличная магияAleksey Solntsev
 
Hazelcast Deep Dive (Paris JUG-2)
Hazelcast Deep Dive (Paris JUG-2)Hazelcast Deep Dive (Paris JUG-2)
Hazelcast Deep Dive (Paris JUG-2)Emrah Kocaman
 

En vedette (19)

50 nouvelles choses que l'on peut faire en Java 8
50 nouvelles choses que l'on peut faire en Java 850 nouvelles choses que l'on peut faire en Java 8
50 nouvelles choses que l'on peut faire en Java 8
 
ArrayList et LinkedList sont dans un bateau
ArrayList et LinkedList sont dans un bateauArrayList et LinkedList sont dans un bateau
ArrayList et LinkedList sont dans un bateau
 
Java SE 8 for Java EE developers
Java SE 8 for Java EE developersJava SE 8 for Java EE developers
Java SE 8 for Java EE developers
 
Déploiement d'une application Java EE dans Azure
Déploiement d'une application Java EE dans AzureDéploiement d'une application Java EE dans Azure
Déploiement d'une application Java EE dans Azure
 
Async Gateway или Разработка системы распределенных вычислений с нуля
Async Gateway или Разработка системы распределенных вычислений с нуляAsync Gateway или Разработка системы распределенных вычислений с нуля
Async Gateway или Разработка системы распределенных вычислений с нуля
 
Hazelcast and MongoDB at Cloud CMS
Hazelcast and MongoDB at Cloud CMSHazelcast and MongoDB at Cloud CMS
Hazelcast and MongoDB at Cloud CMS
 
Phoenix for Rubyists
Phoenix for RubyistsPhoenix for Rubyists
Phoenix for Rubyists
 
HighLoad++ 2009 In-Memory Data Grids
HighLoad++ 2009 In-Memory Data GridsHighLoad++ 2009 In-Memory Data Grids
HighLoad++ 2009 In-Memory Data Grids
 
Алексей Николаенков, Devexperts
Алексей Николаенков, DevexpertsАлексей Николаенков, Devexperts
Алексей Николаенков, Devexperts
 
Hazelcast for Terracotta Users
Hazelcast for Terracotta UsersHazelcast for Terracotta Users
Hazelcast for Terracotta Users
 
Amazon cloud – готовим вместе
Amazon cloud – готовим вместеAmazon cloud – готовим вместе
Amazon cloud – готовим вместе
 
Code review at large scale
Code review at large scaleCode review at large scale
Code review at large scale
 
ЖК Зорге 9
ЖК Зорге 9ЖК Зорге 9
ЖК Зорге 9
 
Gamification in outsourcing company: experience report.
Gamification in outsourcing company: experience report.Gamification in outsourcing company: experience report.
Gamification in outsourcing company: experience report.
 
Очень вкусный фрукт Guava
Очень вкусный фрукт GuavaОчень вкусный фрукт Guava
Очень вкусный фрукт Guava
 
Java 8, the Good, the Bad and the Ugly
Java 8, the Good, the Bad and the UglyJava 8, the Good, the Bad and the Ugly
Java 8, the Good, the Bad and the Ugly
 
Hibernate performance tuning
Hibernate performance tuningHibernate performance tuning
Hibernate performance tuning
 
Maven 3 : уличная магия
Maven 3 : уличная магияMaven 3 : уличная магия
Maven 3 : уличная магия
 
Hazelcast Deep Dive (Paris JUG-2)
Hazelcast Deep Dive (Paris JUG-2)Hazelcast Deep Dive (Paris JUG-2)
Hazelcast Deep Dive (Paris JUG-2)
 

Similaire à JFokus 50 new things with java 8

AST Transformations at JFokus
AST Transformations at JFokusAST Transformations at JFokus
AST Transformations at JFokusHamletDRC
 
NetPonto - The Future Of C# - NetConf Edition
NetPonto - The Future Of C# - NetConf EditionNetPonto - The Future Of C# - NetConf Edition
NetPonto - The Future Of C# - NetConf EditionPaulo Morgado
 
Spark with Elasticsearch - umd version 2014
Spark with Elasticsearch - umd version 2014Spark with Elasticsearch - umd version 2014
Spark with Elasticsearch - umd version 2014Holden Karau
 
What did you miss in Java from 9-13?
What did you miss in Java from 9-13?What did you miss in Java from 9-13?
What did you miss in Java from 9-13?relix1988
 
.NET Core Summer event 2019 in Brno, CZ - Async demystified -- Karel Zikmund
.NET Core Summer event 2019 in Brno, CZ - Async demystified -- Karel Zikmund.NET Core Summer event 2019 in Brno, CZ - Async demystified -- Karel Zikmund
.NET Core Summer event 2019 in Brno, CZ - Async demystified -- Karel ZikmundKarel Zikmund
 
最近作ったN個のCPANモジュール Yokohama.pm #10
最近作ったN個のCPANモジュール Yokohama.pm #10最近作ったN個のCPANモジュール Yokohama.pm #10
最近作ったN個のCPANモジュール Yokohama.pm #10Masahiro Nagano
 
Async. and Realtime Geo Applications with Node.js
Async. and Realtime Geo Applications with Node.jsAsync. and Realtime Geo Applications with Node.js
Async. and Realtime Geo Applications with Node.jsShoaib Burq
 
JSR 310. New Date API in Java 8
JSR 310. New Date API in Java 8JSR 310. New Date API in Java 8
JSR 310. New Date API in Java 8Serhii Kartashov
 
Introducere In Java Jx
Introducere In Java JxIntroducere In Java Jx
Introducere In Java Jxdanielnastase
 
Tuga IT 2018 Summer Edition - The Future of C#
Tuga IT 2018 Summer Edition - The Future of C#Tuga IT 2018 Summer Edition - The Future of C#
Tuga IT 2018 Summer Edition - The Future of C#Paulo Morgado
 
NDC Sydney 2019 - Async Demystified -- Karel Zikmund
NDC Sydney 2019 - Async Demystified -- Karel ZikmundNDC Sydney 2019 - Async Demystified -- Karel Zikmund
NDC Sydney 2019 - Async Demystified -- Karel ZikmundKarel Zikmund
 
Desafios do Profissionalismo Ágil
Desafios do Profissionalismo ÁgilDesafios do Profissionalismo Ágil
Desafios do Profissionalismo ÁgilVictor Hugo Germano
 
«Работа с базами данных с использованием Sequel»
«Работа с базами данных с использованием Sequel»«Работа с базами данных с использованием Sequel»
«Работа с базами данных с использованием Sequel»Olga Lavrentieva
 
rules, events and workflow
rules, events and workflowrules, events and workflow
rules, events and workflowMark Proctor
 
Unity 2018からのハイパフォーマンスな機能紹介
Unity 2018からのハイパフォーマンスな機能紹介Unity 2018からのハイパフォーマンスな機能紹介
Unity 2018からのハイパフォーマンスな機能紹介dena_genom
 
Java 8 Puzzlers as it was presented at Codemash 2017
Java 8 Puzzlers as it was presented at Codemash 2017Java 8 Puzzlers as it was presented at Codemash 2017
Java 8 Puzzlers as it was presented at Codemash 2017Baruch Sadogursky
 

Similaire à JFokus 50 new things with java 8 (20)

Java 8 Date and Time API
Java 8 Date and Time APIJava 8 Date and Time API
Java 8 Date and Time API
 
AST Transformations at JFokus
AST Transformations at JFokusAST Transformations at JFokus
AST Transformations at JFokus
 
NetPonto - The Future Of C# - NetConf Edition
NetPonto - The Future Of C# - NetConf EditionNetPonto - The Future Of C# - NetConf Edition
NetPonto - The Future Of C# - NetConf Edition
 
Spark with Elasticsearch - umd version 2014
Spark with Elasticsearch - umd version 2014Spark with Elasticsearch - umd version 2014
Spark with Elasticsearch - umd version 2014
 
What did you miss in Java from 9-13?
What did you miss in Java from 9-13?What did you miss in Java from 9-13?
What did you miss in Java from 9-13?
 
.NET Core Summer event 2019 in Brno, CZ - Async demystified -- Karel Zikmund
.NET Core Summer event 2019 in Brno, CZ - Async demystified -- Karel Zikmund.NET Core Summer event 2019 in Brno, CZ - Async demystified -- Karel Zikmund
.NET Core Summer event 2019 in Brno, CZ - Async demystified -- Karel Zikmund
 
最近作ったN個のCPANモジュール Yokohama.pm #10
最近作ったN個のCPANモジュール Yokohama.pm #10最近作ったN個のCPANモジュール Yokohama.pm #10
最近作ったN個のCPANモジュール Yokohama.pm #10
 
Async. and Realtime Geo Applications with Node.js
Async. and Realtime Geo Applications with Node.jsAsync. and Realtime Geo Applications with Node.js
Async. and Realtime Geo Applications with Node.js
 
JSR 310. New Date API in Java 8
JSR 310. New Date API in Java 8JSR 310. New Date API in Java 8
JSR 310. New Date API in Java 8
 
Introducere In Java Jx
Introducere In Java JxIntroducere In Java Jx
Introducere In Java Jx
 
Tuga IT 2018 Summer Edition - The Future of C#
Tuga IT 2018 Summer Edition - The Future of C#Tuga IT 2018 Summer Edition - The Future of C#
Tuga IT 2018 Summer Edition - The Future of C#
 
NDC Sydney 2019 - Async Demystified -- Karel Zikmund
NDC Sydney 2019 - Async Demystified -- Karel ZikmundNDC Sydney 2019 - Async Demystified -- Karel Zikmund
NDC Sydney 2019 - Async Demystified -- Karel Zikmund
 
Fantom and Tales
Fantom and TalesFantom and Tales
Fantom and Tales
 
Having Fun Programming!
Having Fun Programming!Having Fun Programming!
Having Fun Programming!
 
Desafios do Profissionalismo Ágil
Desafios do Profissionalismo ÁgilDesafios do Profissionalismo Ágil
Desafios do Profissionalismo Ágil
 
«Работа с базами данных с использованием Sequel»
«Работа с базами данных с использованием Sequel»«Работа с базами данных с использованием Sequel»
«Работа с базами данных с использованием Sequel»
 
Current State of Coroutines
Current State of CoroutinesCurrent State of Coroutines
Current State of Coroutines
 
rules, events and workflow
rules, events and workflowrules, events and workflow
rules, events and workflow
 
Unity 2018からのハイパフォーマンスな機能紹介
Unity 2018からのハイパフォーマンスな機能紹介Unity 2018からのハイパフォーマンスな機能紹介
Unity 2018からのハイパフォーマンスな機能紹介
 
Java 8 Puzzlers as it was presented at Codemash 2017
Java 8 Puzzlers as it was presented at Codemash 2017Java 8 Puzzlers as it was presented at Codemash 2017
Java 8 Puzzlers as it was presented at Codemash 2017
 

Plus de José Paumard

Loom Virtual Threads in the JDK 19
Loom Virtual Threads in the JDK 19Loom Virtual Threads in the JDK 19
Loom Virtual Threads in the JDK 19José Paumard
 
From Java 11 to 17 and beyond.pdf
From Java 11 to 17 and beyond.pdfFrom Java 11 to 17 and beyond.pdf
From Java 11 to 17 and beyond.pdfJosé Paumard
 
The Future of Java: Records, Sealed Classes and Pattern Matching
The Future of Java: Records, Sealed Classes and Pattern MatchingThe Future of Java: Records, Sealed Classes and Pattern Matching
The Future of Java: Records, Sealed Classes and Pattern MatchingJosé Paumard
 
Deep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UKDeep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UKJosé Paumard
 
Designing functional and fluent API: application to some GoF patterns
Designing functional and fluent API: application to some GoF patternsDesigning functional and fluent API: application to some GoF patterns
Designing functional and fluent API: application to some GoF patternsJosé Paumard
 
Designing functional and fluent API: example of the Visitor Pattern
Designing functional and fluent API: example of the Visitor PatternDesigning functional and fluent API: example of the Visitor Pattern
Designing functional and fluent API: example of the Visitor PatternJosé Paumard
 
Construire son JDK en 10 étapes
Construire son JDK en 10 étapesConstruire son JDK en 10 étapes
Construire son JDK en 10 étapesJosé Paumard
 
Java Keeps Throttling Up!
Java Keeps Throttling Up!Java Keeps Throttling Up!
Java Keeps Throttling Up!José Paumard
 
Asynchronous Systems with Fn Flow
Asynchronous Systems with Fn FlowAsynchronous Systems with Fn Flow
Asynchronous Systems with Fn FlowJosé Paumard
 
JAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJosé Paumard
 
JAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridgeJAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridgeJosé Paumard
 
L'API Collector dans tous ses états
L'API Collector dans tous ses étatsL'API Collector dans tous ses états
L'API Collector dans tous ses étatsJosé Paumard
 
API Asynchrones en Java 8
API Asynchrones en Java 8API Asynchrones en Java 8
API Asynchrones en Java 8José Paumard
 

Plus de José Paumard (14)

Loom Virtual Threads in the JDK 19
Loom Virtual Threads in the JDK 19Loom Virtual Threads in the JDK 19
Loom Virtual Threads in the JDK 19
 
From Java 11 to 17 and beyond.pdf
From Java 11 to 17 and beyond.pdfFrom Java 11 to 17 and beyond.pdf
From Java 11 to 17 and beyond.pdf
 
The Future of Java: Records, Sealed Classes and Pattern Matching
The Future of Java: Records, Sealed Classes and Pattern MatchingThe Future of Java: Records, Sealed Classes and Pattern Matching
The Future of Java: Records, Sealed Classes and Pattern Matching
 
Deep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UKDeep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UK
 
Designing functional and fluent API: application to some GoF patterns
Designing functional and fluent API: application to some GoF patternsDesigning functional and fluent API: application to some GoF patterns
Designing functional and fluent API: application to some GoF patterns
 
Designing functional and fluent API: example of the Visitor Pattern
Designing functional and fluent API: example of the Visitor PatternDesigning functional and fluent API: example of the Visitor Pattern
Designing functional and fluent API: example of the Visitor Pattern
 
Construire son JDK en 10 étapes
Construire son JDK en 10 étapesConstruire son JDK en 10 étapes
Construire son JDK en 10 étapes
 
Java Keeps Throttling Up!
Java Keeps Throttling Up!Java Keeps Throttling Up!
Java Keeps Throttling Up!
 
Asynchronous Systems with Fn Flow
Asynchronous Systems with Fn FlowAsynchronous Systems with Fn Flow
Asynchronous Systems with Fn Flow
 
JAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) Bridge
 
Streams in the wild
Streams in the wildStreams in the wild
Streams in the wild
 
JAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridgeJAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridge
 
L'API Collector dans tous ses états
L'API Collector dans tous ses étatsL'API Collector dans tous ses états
L'API Collector dans tous ses états
 
API Asynchrones en Java 8
API Asynchrones en Java 8API Asynchrones en Java 8
API Asynchrones en Java 8
 

Dernier

How to Add Barcode on PDF Report in Odoo 17
How to Add Barcode on PDF Report in Odoo 17How to Add Barcode on PDF Report in Odoo 17
How to Add Barcode on PDF Report in Odoo 17Celine George
 
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdf
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdfAMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdf
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdfphamnguyenenglishnb
 
Q4 English4 Week3 PPT Melcnmg-based.pptx
Q4 English4 Week3 PPT Melcnmg-based.pptxQ4 English4 Week3 PPT Melcnmg-based.pptx
Q4 English4 Week3 PPT Melcnmg-based.pptxnelietumpap1
 
Grade 9 Q4-MELC1-Active and Passive Voice.pptx
Grade 9 Q4-MELC1-Active and Passive Voice.pptxGrade 9 Q4-MELC1-Active and Passive Voice.pptx
Grade 9 Q4-MELC1-Active and Passive Voice.pptxChelloAnnAsuncion2
 
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
Karra SKD Conference Presentation Revised.pptx
Karra SKD Conference Presentation Revised.pptxKarra SKD Conference Presentation Revised.pptx
Karra SKD Conference Presentation Revised.pptxAshokKarra1
 
What is Model Inheritance in Odoo 17 ERP
What is Model Inheritance in Odoo 17 ERPWhat is Model Inheritance in Odoo 17 ERP
What is Model Inheritance in Odoo 17 ERPCeline George
 
ECONOMIC CONTEXT - LONG FORM TV DRAMA - PPT
ECONOMIC CONTEXT - LONG FORM TV DRAMA - PPTECONOMIC CONTEXT - LONG FORM TV DRAMA - PPT
ECONOMIC CONTEXT - LONG FORM TV DRAMA - PPTiammrhaywood
 
Roles & Responsibilities in Pharmacovigilance
Roles & Responsibilities in PharmacovigilanceRoles & Responsibilities in Pharmacovigilance
Roles & Responsibilities in PharmacovigilanceSamikshaHamane
 
Procuring digital preservation CAN be quick and painless with our new dynamic...
Procuring digital preservation CAN be quick and painless with our new dynamic...Procuring digital preservation CAN be quick and painless with our new dynamic...
Procuring digital preservation CAN be quick and painless with our new dynamic...Jisc
 
Keynote by Prof. Wurzer at Nordex about IP-design
Keynote by Prof. Wurzer at Nordex about IP-designKeynote by Prof. Wurzer at Nordex about IP-design
Keynote by Prof. Wurzer at Nordex about IP-designMIPLM
 
Field Attribute Index Feature in Odoo 17
Field Attribute Index Feature in Odoo 17Field Attribute Index Feature in Odoo 17
Field Attribute Index Feature in Odoo 17Celine George
 
Choosing the Right CBSE School A Comprehensive Guide for Parents
Choosing the Right CBSE School A Comprehensive Guide for ParentsChoosing the Right CBSE School A Comprehensive Guide for Parents
Choosing the Right CBSE School A Comprehensive Guide for Parentsnavabharathschool99
 
Science 7 Quarter 4 Module 2: Natural Resources.pptx
Science 7 Quarter 4 Module 2: Natural Resources.pptxScience 7 Quarter 4 Module 2: Natural Resources.pptx
Science 7 Quarter 4 Module 2: Natural Resources.pptxMaryGraceBautista27
 
Influencing policy (training slides from Fast Track Impact)
Influencing policy (training slides from Fast Track Impact)Influencing policy (training slides from Fast Track Impact)
Influencing policy (training slides from Fast Track Impact)Mark Reed
 
ENGLISH6-Q4-W3.pptxqurter our high choom
ENGLISH6-Q4-W3.pptxqurter our high choomENGLISH6-Q4-W3.pptxqurter our high choom
ENGLISH6-Q4-W3.pptxqurter our high choomnelietumpap1
 
ANG SEKTOR NG agrikultura.pptx QUARTER 4
ANG SEKTOR NG agrikultura.pptx QUARTER 4ANG SEKTOR NG agrikultura.pptx QUARTER 4
ANG SEKTOR NG agrikultura.pptx QUARTER 4MiaBumagat1
 

Dernier (20)

How to Add Barcode on PDF Report in Odoo 17
How to Add Barcode on PDF Report in Odoo 17How to Add Barcode on PDF Report in Odoo 17
How to Add Barcode on PDF Report in Odoo 17
 
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdf
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdfAMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdf
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdf
 
Q4 English4 Week3 PPT Melcnmg-based.pptx
Q4 English4 Week3 PPT Melcnmg-based.pptxQ4 English4 Week3 PPT Melcnmg-based.pptx
Q4 English4 Week3 PPT Melcnmg-based.pptx
 
Grade 9 Q4-MELC1-Active and Passive Voice.pptx
Grade 9 Q4-MELC1-Active and Passive Voice.pptxGrade 9 Q4-MELC1-Active and Passive Voice.pptx
Grade 9 Q4-MELC1-Active and Passive Voice.pptx
 
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️
 
TataKelola dan KamSiber Kecerdasan Buatan v022.pdf
TataKelola dan KamSiber Kecerdasan Buatan v022.pdfTataKelola dan KamSiber Kecerdasan Buatan v022.pdf
TataKelola dan KamSiber Kecerdasan Buatan v022.pdf
 
Karra SKD Conference Presentation Revised.pptx
Karra SKD Conference Presentation Revised.pptxKarra SKD Conference Presentation Revised.pptx
Karra SKD Conference Presentation Revised.pptx
 
What is Model Inheritance in Odoo 17 ERP
What is Model Inheritance in Odoo 17 ERPWhat is Model Inheritance in Odoo 17 ERP
What is Model Inheritance in Odoo 17 ERP
 
ECONOMIC CONTEXT - LONG FORM TV DRAMA - PPT
ECONOMIC CONTEXT - LONG FORM TV DRAMA - PPTECONOMIC CONTEXT - LONG FORM TV DRAMA - PPT
ECONOMIC CONTEXT - LONG FORM TV DRAMA - PPT
 
Roles & Responsibilities in Pharmacovigilance
Roles & Responsibilities in PharmacovigilanceRoles & Responsibilities in Pharmacovigilance
Roles & Responsibilities in Pharmacovigilance
 
Procuring digital preservation CAN be quick and painless with our new dynamic...
Procuring digital preservation CAN be quick and painless with our new dynamic...Procuring digital preservation CAN be quick and painless with our new dynamic...
Procuring digital preservation CAN be quick and painless with our new dynamic...
 
Keynote by Prof. Wurzer at Nordex about IP-design
Keynote by Prof. Wurzer at Nordex about IP-designKeynote by Prof. Wurzer at Nordex about IP-design
Keynote by Prof. Wurzer at Nordex about IP-design
 
Field Attribute Index Feature in Odoo 17
Field Attribute Index Feature in Odoo 17Field Attribute Index Feature in Odoo 17
Field Attribute Index Feature in Odoo 17
 
Choosing the Right CBSE School A Comprehensive Guide for Parents
Choosing the Right CBSE School A Comprehensive Guide for ParentsChoosing the Right CBSE School A Comprehensive Guide for Parents
Choosing the Right CBSE School A Comprehensive Guide for Parents
 
LEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptx
LEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptxLEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptx
LEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptx
 
Science 7 Quarter 4 Module 2: Natural Resources.pptx
Science 7 Quarter 4 Module 2: Natural Resources.pptxScience 7 Quarter 4 Module 2: Natural Resources.pptx
Science 7 Quarter 4 Module 2: Natural Resources.pptx
 
Influencing policy (training slides from Fast Track Impact)
Influencing policy (training slides from Fast Track Impact)Influencing policy (training slides from Fast Track Impact)
Influencing policy (training slides from Fast Track Impact)
 
ENGLISH6-Q4-W3.pptxqurter our high choom
ENGLISH6-Q4-W3.pptxqurter our high choomENGLISH6-Q4-W3.pptxqurter our high choom
ENGLISH6-Q4-W3.pptxqurter our high choom
 
Raw materials used in Herbal Cosmetics.pptx
Raw materials used in Herbal Cosmetics.pptxRaw materials used in Herbal Cosmetics.pptx
Raw materials used in Herbal Cosmetics.pptx
 
ANG SEKTOR NG agrikultura.pptx QUARTER 4
ANG SEKTOR NG agrikultura.pptx QUARTER 4ANG SEKTOR NG agrikultura.pptx QUARTER 4
ANG SEKTOR NG agrikultura.pptx QUARTER 4
 

JFokus 50 new things with java 8