SlideShare una empresa de Scribd logo
1 de 121
Descargar para leer sin conexión
START
MovieTime!
Andrzej Grzesik Konrad Malawski
JAVA 8
Andrzej Grzesik Konrad Malawski
JAVA 8
THE GOOD PARTS
Andrzej Grzesik Konrad Malawski
@ags313
andrzej@grzesik.it
andrzejgrzesik.info
Andrzej Grzesik
ABOUT:ME
 
Konrad `@ktosopl` Malawski
 
Konrad `@ktosopl` Malawski
OUR OPINIONS
ARE OUR OWN
disclaimer
QUESTIONS?
QUESTIONS?
ask them right away!
JAVA 8
is going to be amazing!
TWITTER SAYS:
JAVA 8 ISTHE NEW GUAVA
THE MOST EXCITING RELEASE IN HISTORY
DONE WITH COMMUNITY
ADOPT OPENJDK
adoptopenjdk.java.net
YOU CAN HELP!
FIX
TEST
HACK
DOCUMENT
ADOPTOPENJDK.JAVA.NET
ADOPTAJSR.JAVA.NET
HOW DO I CHECK JDK8?
JDK8.JAVA.NET
IDE SUPPORT
JENV
http://jenv.be
JENV
$ jenv versions
system
oracle64-1.6.0.51
oracle64-1.7.0.40
* oracle64-1.8.0-ea (set by /Users/ktoso/.jenv/version)
JENV
ktoso @ 月/tmp
$ jenv local oracle64-1.7.0.40
JENV
ktoso @ 月/tmp
$ jenv versions
systema
oracle64-1.6.0.51
* oracle64-1.7.0.40 (set by /tmp/.java-version)
oracle64-1.8.0-ea
ktoso @ 月/tmp
$ jenv local oracle64-1.7.0.40
NEWTIME API
jsr 310
void immutable()
{
LocalTime aTime = LocalTime.now();
print("now: %s", aTime);
LocalTime newTime = aTime.plusMinutes(16);
print("now: %s, later: %s", aTime, newTime);
}
void immutable()
{
LocalTime aTime = LocalTime.now();
print("now: %s", aTime);
LocalTime newTime = aTime.plusMinutes(16);
print("now: %s, later: %s", aTime, newTime);
}
now: 01:25:56.916
now: 01:25:56.916
later: 01:41:56.916
void immutable()
{
LocalTime aTime = LocalTime.now();
print("now: %s", aTime);
LocalTime newTime = aTime.plusMinutes(16);
print("now: %s, later: %s", aTime, newTime);
}
now: 01:25:56.916
private void localTime()
{
LocalDate today = LocalDate.now();
LocalDate yesterday = today.minusDays(1);
// Geek Bike Ride!
LocalDateTime localDateTime = yesterday.atTime(11, 30);
LocalDateTime earlyMorning = LocalDate.of(2013, 9, 22)
.atStartOfDay();
}
void flightTime()
{
ZoneId LHR = ZoneId.of("Europe/London");
ZoneId SFO = ZoneId.of("America/Los_Angeles");
LocalDate date = LocalDate.of(2013, Month.SEPTEMBER, 14);
LocalTime takeoff = LocalTime.of(12, 50);
LocalTime landing = LocalTime.of(16, 20);
Duration flightTime = Duration.between(
ZonedDateTime.of(date, takeoff, LHR),
ZonedDateTime.of(date, landing, SFO));
System.out.println("Flight time: " + flightTime);
}
void flightTime()
{
ZoneId LHR = ZoneId.of("Europe/London");
ZoneId SFO = ZoneId.of("America/Los_Angeles");
LocalDate date = LocalDate.of(2013, Month.SEPTEMBER, 14);
LocalTime takeoff = LocalTime.of(12, 50);
LocalTime landing = LocalTime.of(16, 20);
Duration flightTime = Duration.between(
ZonedDateTime.of(date, takeoff, LHR),
ZonedDateTime.of(date, landing, SFO));
System.out.println("Flight time: " + flightTime);
}
Flight time:
PT11H30M
ISO BY DEFAULT
NO MORE
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
void formatting()
{
DateTimeFormatter.ISO_DATE.
format(LocalDateTime.of(2013, 9, 22, 10, 03));
DateTimeFormatter.ISO_DATE_TIME.
format(LocalDateTime.of(2013, 9, 22, 10, 30));
}
void formatting()
{
DateTimeFormatter.ISO_DATE.
format(LocalDateTime.of(2013, 9, 22, 10, 03));
DateTimeFormatter.ISO_DATE_TIME.
format(LocalDateTime.of(2013, 9, 22, 10, 30));
}
2013-09-22
void formatting()
{
DateTimeFormatter.ISO_DATE.
format(LocalDateTime.of(2013, 9, 22, 10, 03));
DateTimeFormatter.ISO_DATE_TIME.
format(LocalDateTime.of(2013, 9, 22, 10, 30));
}
2013-09-22
2013-09-22T10:30:00
void formatterError()
{
ISO_DATE_TIME.format(LocalDate.of(2013, 9, 22));
/*
Exception in thread "main"
java.time.temporal.UnsupportedTemporalTypeException: Unsupported
field: HourOfDay
! at java.time.LocalDate.get0(LocalDate.java:670)
! at java.time.LocalDate.getLong(LocalDate.java:649)
! at
java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.ja
va:297)
! (..)!
*/
}
TUTORIAL
http://docs.oracle.com/javase/tutorial/datetime/index.html
API
ENHANCEMENTS
BETTER IO
void betterIO()
{
BufferedReader bufferedReader;
Path path;
Stream<String> lines = bufferedReader.lines();
Stream<String> lines = Files.lines(Path, Charset);
Stream<Path> paths = Files.list(Path);
Stream<Path> paths = Files.find(Path, depth, BiPredicate,
FileVisitOption...)
Stream<Path> paths = Files.walk(Path, depth, FileVisitOption...)
Stream<Path> paths = Files.walk(Path, FileVisitOption...)
DirectoryStream.stream()
}
MAPS
compute()
{
map.compute(aKey, new BiFunction<Key, Value, Value>() {
@Override
public Value apply(Key key, Value value)
{
// ...
}
});
map.computeIfAbsent(aKey, new Function<Key, Value>() {
@Override
public Value apply(Key key)
{
// ...
}
});
map.computeIfPresent(aKey, new BiFunction<Key, Value, Value>() {
@Override
public Value apply(Key key, Value value)
{
// ...
}
});
}
void computeWithLambdas()
{
Map<Key, Value> map = // ...
map.computeIfAbsent(aKey, key -> {
// ...
});
map.computeIfPresent(aKey, (key, value) -> {
// ...
});
}
void moreMaps()
{
Map<Key, Value> map = null;
map.putIfAbsent(K, V);
map.remove(Object, Object);
map.replace(K, V);
// Compare and swap
map.replace(K, V1, V2);
map.replaceAll(BiFunction);
map.getOrDefault(K, V);
map.merge(K, V, BiFunction)
}
[5, 8, 6, 7, 2, 1, 4, 3]
void parallelSetAll()
{
int[] array = new int[8];
AtomicInteger i = new AtomicInteger();
Arrays.parallelSetAll(array, operand -> i.incrementAndGet());
}
void parallelPrefix()
{
int[] array = { 1, 2, 4, 8 };
Arrays.parallelPrefix(array, (left, right) -> {
return left + right;
});
}
LAMBDAS?
LAMBDAS!
(finally)
LAMBDAS
Notable inspirations would be:
Scala
Groovy
Lisps
.NOT (!)
() -> {}
LAMBDAS
LAMBDAS
(Thing t) -> {}
LAMBDAS
LAMBDAS
(Thing t) -> {}
LAMBDAS
(Thing t) -> {}
(Thing t, More m) -> {}
LAMBDAS &TYPES
LAMBDAS &TYPES
GetNum _ = (t) -> {42}
LAMBDAS &TYPES
GetNum _ = (t) -> {42}
GetNum _ = (t) -> 42
LAMBDAS &TYPES
GetNum _ = (t) -> {42}
GetNum _ = (t) -> 42
GetNum _ = t -> 1337
interface Adder {
void add(int a, int b);
}
TARGETTYPING
interface Adder {
void add(int a, int b);
}
TARGETTYPING
Adder function = (int a, int b) -> { a + b };
interface Adder {
void add(int a, int b);
}
TARGETTYPING
Adder function = (int a, int b) -> { a + b };
interface Adder {
void add(int a, int b);
}
TARGETTYPING
Adder function = (int a, int b) -> { a + b };
(int, int) => int
gets converted into target type:
Adder
interface Adder {
void add(int a, int b);
}
TARGETTYPING
Adder function = (int a, int b) -> { a + b };
// or shorter:
Adder function = (a, b) -> a + b;
interface Adder {
void add(int a, int b);
}
TARGETTYPING
Adder function = (int a, int b) -> { a + b };
// or shorter:
Adder function = (a, b) -> a + b;
You can skip the ; sign!
interface Adder {
void add(int a, int b);
}
TARGETTYPING
Adder function = (int a, int b) -> { a + b };
// or shorter:
Adder function = (a, b) -> a + b;
You can skip { } sometimes
You can skip the ; sign!
interface Adder {
void add(int a, int b);
}
TARGETTYPING
Adder function = (int a, int b) -> { a + b };
// or shorter:
Adder function = (a, b) -> a + b;
You can skip { } sometimes
You can skip the ; sign!
and the types are inferred!
FUNCTIONAL INTERFACES
interface Adder {
void add(int a, int b);
}
FUNCTIONAL INTERFACES
@FunctionalInterface
interface Adder {
void add(int a, int b);
}
FUNCTIONAL INTERFACES
@FunctionalInterface
interface Adder {
void add(int a, int b);
}
Similar to @Override:
* not required,
* checks our intent.
FUNCTIONAL INTERFACES
@FunctionalInterface
interface Adder {
void add(int a, int b);
void wat();
}
FUNCTIONAL INTERFACES
@FunctionalInterface
interface Adder {
void add(int a, int b);
void wat();
}
java: Unexpected @FunctionalInterface annotation
pl.project13.lambda.test.examples.Adder is not a functional interface
multiple non-overriding abstract methods found in interface
pl.project13.lambda.test.examples.Adder
DEFAULT METHODS
@FunctionalInterface
interface Adder {
void add(int a, int b);
default void wat() { /* nothing... */ }
}
OK!
Only 1 abstract method.
DEFAULT METHODS
@FunctionalInterface
interface Adder {
default int add(int a, int b) { return a + b; }
}
@FunctionalInterface
interface Divider {
default double divide(int a, int b) { return a / b; }
}
class Calculator implements Adder, Divider {
public double calc(int a, int b, int c) {
return divide(add(a, b), c);
}
}
DEFAULT METHODS
We mixed in methods!
here! and here!
@FunctionalInterface
interface Adder {
default int add(int a, int b) { return a + b; }
}
@FunctionalInterface
interface Divider {
default double divide(int a, int b) { return a / b; }
}
class Calculator implements Adder, Divider {
public double calc(int a, int b, int c) {
return divide(add(a, b), c);
}
}
interface A {
default void doIt() { /* A */ }
}
interface B {
default void doIt() { /* B */ }
}
class Thing implements A, B {
}
DEFAULT METHODS
interface A {
default void doIt() { /* A */ }
}
interface B {
default void doIt() { /* B */ }
}
class Thing implements A, B {
}
DEFAULT METHODS
java: class com.javaone.Thing inherits unrelated defaults for doIt()
from types com.javaone.A and com.javaone.B
DEFAULT METHODS
interface A {
default void doIt() { /* A */ }
}
interface B {
default void doIt() { /* B */ }
}
class Thing implements A, B {
@Override
public void doIt() {
A.super.doIt();
}
}
Resolve ambiguity manually!
DEFAULT METHODS
interface A {
default void doIt() { /* A */ }
}
interface B {
default void doIt() { /* B */ }
}
class Thing implements A, B {
@Override
public void doIt() {
A.super.doIt();
}
}
Resolve ambiguity manually!
DEFAULT IN ITERABLE
package java.lang;
@FunctionalInterface
public interface Iterable<T> {
Iterator<T> iterator();
/** @since 1.8 */
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
void withoutLambda()
{
button.addActionListener(new AbstractAction()
{
@Override
public void actionPerformed(ActionEvent e)
{
System.out.println("example");
}
});
}
λ IN ACTION
BEFORE LAMBDAS
in IntelliJ
void withLambda()
{
button.addActionListener((e) ->
{
System.out.println("example");
});
}
λ IN ACTION
void composingFunctions()
{
// given
Function<Integer, Integer> timesTwo = n -> n * 2;
Function<Integer, Integer> plusOne = n -> n + 1;
// when
Function<Integer, Integer> multiplyThenAdd =
timesTwo.andThen(plusOne);
// equivalent to
Function<Integer, Integer> multiplyThenAdd =
plusOne.compose(timesTwo);
// then
int result = multiplyThenAdd.apply(1);
assertThat(result).isEqualTo(3);
}
REMOVING BOILERPLATE
STREAMS
void transform()
{
Iterables.transform(
newArrayList(1, 2, 3),
new Function<Integer, String>()
{
@Override
public String apply(Integer input)
{
return input.toString();
}
});
}
void transform()
{
Iterables.transform(
newArrayList(1, 2, 3),
new Function<Integer, String>()
{
@Override
public String apply(Integer input)
{
return input.toString();
}
});
}
void noMoreTransform()
{
items.stream().map(i -> i.toString());
}
vs
items.stream().map(Item::getName);
compared to Scala
items map { _.getName }
items.stream().map(Item::getName);
yay, we’re cool now!
compared to Scala
items map { _.getName }
STREAMS
items.stream().
filter(predicate);
map(mapper);
mapToInt(mapper);
flatMap(mapper);
distinct();
sorted();
sorted(comparator);
peek(consumer);
limit(maxSize);
forEach(func);
INTERNAL ITERATION
void internalIteration()
{
List<Thing> things = ...;
things.forEach(System.out::println);
}
PARALLELIZE?
PARALLEL ITERATION
void parallelIteration()
{
List<Thing> things = ...;
things.parallelStream().forEach(System.out::println);
}
STREAMS ARE LAZY!
List<Integer> is = newArrayList(1, 2, 3);
is.stream()
.map(a -> printAndReturn("A", a))
.map(a -> printAndReturn("B", a));
STREAMS ARE LAZY
List<Integer> is = newArrayList(1, 2, 3);
is.stream()
.map(a -> printAndReturn("A", a))
.map(a -> printAndReturn("B", a));
Prints:
STREAMS ARE LAZY
List<Integer> is = newArrayList(1, 2, 3);
is.stream()
.map(a -> printAndReturn("A", a))
.map(a -> printAndReturn("B", a));
Prints:
STREAMS ARE LAZY
Nothing!
STREAMS ARE LAZY
List<Integer> is = newArrayList(1, 2, 3);
is.stream()
.map(a -> printAndReturn("A", a))
.map(a -> printAndReturn("B", a))
.collect(toList());
STREAMS ARE LAZY
List<Integer> is = newArrayList(1, 2, 3);
is.stream()
.map(a -> printAndReturn("A", a))
.map(a -> printAndReturn("B", a))
.collect(toList());
Prints:
A1
B1
A2
B2
A3
B3
STREAMS ARE LAZY
List<Integer> is = newArrayList(1, 2, 3);
is.stream()
.map(a -> printAndReturn("A", a))
.map(a -> printAndReturn("B", a))
.collect(toList());
Prints:
A1
B1
A2
B2
A3
B3
It’s ONE iteration!
METHOD HANDLES
think function pointers
KEEPING REFERENCES
??? method = Person::getName
class Person {
String getName();
}
?
KEEPING REFERENCES
Supplier<String> method = Person::getName
@FunctionalInterface
public interface Supplier<T> {
T get();
}
class Person {
String getName();
}
void referringToMethods()
{
String name = Person.getName();
String name = applyTo(heinz, Person::getName);
}
REFERRINGTO METHODS
String normalName = heinz.getName();
String magicName = applyTo(heinz, Person::getName);
public <T, R> R applyTo(T obj, Function<T, R> function) {
return function.apply(obj);
}
JAVA.UTIL.FUNCTION.*
Supplier<T>
=> T
Consumer<T>
T => void
Predicate<T>
T => Boolean
BiPredicate<T1, T2>
(T1, T2) => Boolean
Function<T, R>
T => R
BiFunction<T1, T2, R>
(T1, T2) => R
and more...!
Fact: in order to refer to:
String doThing(String a, String b, String c, Integer d);
JAVA.UTIL.FUNCTION.*
Fact: in order to refer to:
String doThing(String a, String b, String c, Integer d);
you have to:
@FunctionalInterface
interface Function4<T1, T2, T3, T4, R> {
R apply(T1 a, T2 b, T3 c, T4 d);
}
JAVA.UTIL.FUNCTION.*
Fact: in order to refer to:
String doThing(String a, String b, String c, Integer d);
you have to:
@FunctionalInterface
interface Function4<T1, T2, T3, T4, R> {
R apply(T1 a, T2 b, T3 c, T4 d);
}
Function4<String, String, String, Integer, String> fun =
Example::doThing;
JAVA.UTIL.FUNCTION.*
BACKTOTHE FUTURE!
● http://cr.openjdk.java.net/~briangoetz/
lambda/collections-overview.html
● http://docs.oracle.com/javase/tutorial/java/javaOO/
lambdaexpressions.html
● http://www.techempower.com/blog/2013/03/26/
everything-about-java-8/
● For fun, Lambda Spec:
github.com/ktoso/lambda-spec
THANKYOU!
@ags313
Andrzej Grzesik Konrad Malawski
@ktosopl
TWEET PLEASE!

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

Functional Programming in Java 8 - Exploiting Lambdas
Functional Programming in Java 8 - Exploiting LambdasFunctional Programming in Java 8 - Exploiting Lambdas
Functional Programming in Java 8 - Exploiting Lambdas
 
Java Class Design
Java Class DesignJava Class Design
Java Class Design
 
Java 8 lambda expressions
Java 8 lambda expressionsJava 8 lambda expressions
Java 8 lambda expressions
 
Modern Programming in Java 8 - Lambdas, Streams and Date Time API
Modern Programming in Java 8 - Lambdas, Streams and Date Time APIModern Programming in Java 8 - Lambdas, Streams and Date Time API
Modern Programming in Java 8 - Lambdas, Streams and Date Time API
 
Functional Java 8 in everyday life
Functional Java 8 in everyday lifeFunctional Java 8 in everyday life
Functional Java 8 in everyday life
 
Java 8 Lambda and Streams
Java 8 Lambda and StreamsJava 8 Lambda and Streams
Java 8 Lambda and Streams
 
Java8 features
Java8 featuresJava8 features
Java8 features
 
Java concurrency questions and answers
Java concurrency questions and answers Java concurrency questions and answers
Java concurrency questions and answers
 
Java 8 streams
Java 8 streamsJava 8 streams
Java 8 streams
 
Java 8 features
Java 8 featuresJava 8 features
Java 8 features
 
Functional Thinking - Programming with Lambdas in Java 8
Functional Thinking - Programming with Lambdas in Java 8Functional Thinking - Programming with Lambdas in Java 8
Functional Thinking - Programming with Lambdas in Java 8
 
Streams in Java 8
Streams in Java 8Streams in Java 8
Streams in Java 8
 
Java 8 Lambda Expressions
Java 8 Lambda ExpressionsJava 8 Lambda Expressions
Java 8 Lambda Expressions
 
Java 8 Lambda Expressions & Streams
Java 8 Lambda Expressions & StreamsJava 8 Lambda Expressions & Streams
Java 8 Lambda Expressions & Streams
 
Lambdas and Laughs
Lambdas and LaughsLambdas and Laughs
Lambdas and Laughs
 
Lambda Expressions in Java
Lambda Expressions in JavaLambda Expressions in Java
Lambda Expressions in Java
 
Core Java - Quiz Questions - Bug Hunt
Core Java - Quiz Questions - Bug HuntCore Java - Quiz Questions - Bug Hunt
Core Java - Quiz Questions - Bug Hunt
 
Programming with Lambda Expressions in Java
Programming with Lambda Expressions in Java Programming with Lambda Expressions in Java
Programming with Lambda Expressions in Java
 
Java 8 Streams
Java 8 StreamsJava 8 Streams
Java 8 Streams
 
Java programming-examples
Java programming-examplesJava programming-examples
Java programming-examples
 

Destacado

From Runnable and synchronized To atomically() and parallel()
From Runnable and synchronized To atomically() and parallel()From Runnable and synchronized To atomically() and parallel()
From Runnable and synchronized To atomically() and parallel()
José Paumard
 
JDK8 : parallel programming made (too ?) easy
JDK8 : parallel programming made (too ?) easyJDK8 : parallel programming made (too ?) easy
JDK8 : parallel programming made (too ?) easy
José Paumard
 

Destacado (20)

Java 8 Features
Java 8 FeaturesJava 8 Features
Java 8 Features
 
55 New Features in Java SE 8
55 New Features in Java SE 855 New Features in Java SE 8
55 New Features in Java SE 8
 
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
 
Functional programming with Java 8
Functional programming with Java 8Functional programming with Java 8
Functional programming with Java 8
 
Java 8 - Nuevas características
Java 8 - Nuevas característicasJava 8 - Nuevas características
Java 8 - Nuevas características
 
Java 8 - Features Overview
Java 8 - Features OverviewJava 8 - Features Overview
Java 8 - Features Overview
 
2013 04 20 SpaceApp challenge kraków
2013 04 20 SpaceApp challenge kraków2013 04 20 SpaceApp challenge kraków
2013 04 20 SpaceApp challenge kraków
 
Confitura 2013
Confitura 2013Confitura 2013
Confitura 2013
 
"Z IT na nasze" - czyli na czym polega praca Analityka IT. (Wersja plus size :))
"Z IT na nasze" - czyli na czym polega praca Analityka IT. (Wersja plus size :))"Z IT na nasze" - czyli na czym polega praca Analityka IT. (Wersja plus size :))
"Z IT na nasze" - czyli na czym polega praca Analityka IT. (Wersja plus size :))
 
What's new in Java 8
What's new in Java 8What's new in Java 8
What's new in Java 8
 
whats new in java 8
whats new in java 8 whats new in java 8
whats new in java 8
 
TDC 2015 - Java: from old school to modern art!
TDC 2015 - Java: from old school to modern art!TDC 2015 - Java: from old school to modern art!
TDC 2015 - Java: from old school to modern art!
 
Game Analytics: A Practitioner’s Perspective
Game Analytics: A Practitioner’s PerspectiveGame Analytics: A Practitioner’s Perspective
Game Analytics: A Practitioner’s Perspective
 
From Runnable and synchronized To atomically() and parallel()
From Runnable and synchronized To atomically() and parallel()From Runnable and synchronized To atomically() and parallel()
From Runnable and synchronized To atomically() and parallel()
 
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.
 
JDK8 : parallel programming made (too ?) easy
JDK8 : parallel programming made (too ?) easyJDK8 : parallel programming made (too ?) easy
JDK8 : parallel programming made (too ?) easy
 
Design - The first user test
Design - The first user testDesign - The first user test
Design - The first user test
 
from old java to java8 - KanJava Edition
from old java to java8 - KanJava Editionfrom old java to java8 - KanJava Edition
from old java to java8 - KanJava Edition
 
Java 8 Workshop
Java 8 WorkshopJava 8 Workshop
Java 8 Workshop
 
50 new things you can do with java 8
50 new things you can do with java 850 new things you can do with java 8
50 new things you can do with java 8
 

Similar a Java 8: the good parts!

Your Library Sucks, and why you should use it.
Your Library Sucks, and why you should use it.Your Library Sucks, and why you should use it.
Your Library Sucks, and why you should use it.
Peter Higgins
 
CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on Android
Sven Haiges
 

Similar a Java 8: the good parts! (20)

InterConnect: Java, Node.js and Swift - Which, Why and When
InterConnect: Java, Node.js and Swift - Which, Why and WhenInterConnect: Java, Node.js and Swift - Which, Why and When
InterConnect: Java, Node.js and Swift - Which, Why and When
 
Your Library Sucks, and why you should use it.
Your Library Sucks, and why you should use it.Your Library Sucks, and why you should use it.
Your Library Sucks, and why you should use it.
 
MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know
 
Mongo+java (1)
Mongo+java (1)Mongo+java (1)
Mongo+java (1)
 
CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on Android
 
EcmaScript 6 - The future is here
EcmaScript 6 - The future is hereEcmaScript 6 - The future is here
EcmaScript 6 - The future is here
 
A Recovering Java Developer Learns to Go
A Recovering Java Developer Learns to GoA Recovering Java Developer Learns to Go
A Recovering Java Developer Learns to Go
 
InterConnect2016: WebApp Architectures with Java and Node.js
InterConnect2016: WebApp Architectures with Java and Node.jsInterConnect2016: WebApp Architectures with Java and Node.js
InterConnect2016: WebApp Architectures with Java and Node.js
 
GoCracow #5 Bartlomiej klimczak - GoBDD
GoCracow #5 Bartlomiej klimczak - GoBDDGoCracow #5 Bartlomiej klimczak - GoBDD
GoCracow #5 Bartlomiej klimczak - GoBDD
 
"Javascript" por Tiago Rodrigues
"Javascript" por Tiago Rodrigues"Javascript" por Tiago Rodrigues
"Javascript" por Tiago Rodrigues
 
Effecient javascript
Effecient javascriptEffecient javascript
Effecient javascript
 
Having Fun with Play
Having Fun with PlayHaving Fun with Play
Having Fun with Play
 
Desarrollo para Android con Groovy
Desarrollo para Android con GroovyDesarrollo para Android con Groovy
Desarrollo para Android con Groovy
 
SQLite Techniques
SQLite TechniquesSQLite Techniques
SQLite Techniques
 
REST APIs with Spring
REST APIs with SpringREST APIs with Spring
REST APIs with Spring
 
ActiveWeb: Chicago Java User Group Presentation
ActiveWeb: Chicago Java User Group PresentationActiveWeb: Chicago Java User Group Presentation
ActiveWeb: Chicago Java User Group Presentation
 
Diseño y Desarrollo de APIs
Diseño y Desarrollo de APIsDiseño y Desarrollo de APIs
Diseño y Desarrollo de APIs
 
How to code to code less
How to code to code lessHow to code to code less
How to code to code less
 
SQLite Techniques
SQLite TechniquesSQLite Techniques
SQLite Techniques
 
Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008
 

Más de Andrzej Grzesik

Más de Andrzej Grzesik (10)

JDK, the not so hidden treasures
JDK, the not so hidden treasuresJDK, the not so hidden treasures
JDK, the not so hidden treasures
 
The path to Repeatable Builds
The path to Repeatable BuildsThe path to Repeatable Builds
The path to Repeatable Builds
 
JDK not so hidden treasures
JDK not so hidden treasuresJDK not so hidden treasures
JDK not so hidden treasures
 
Go, the one language to learn in 2014
Go, the one language to learn in 2014Go, the one language to learn in 2014
Go, the one language to learn in 2014
 
Cheffing a department
Cheffing a departmentCheffing a department
Cheffing a department
 
Continuous Delivery Antipatterns
Continuous Delivery AntipatternsContinuous Delivery Antipatterns
Continuous Delivery Antipatterns
 
Continuous Delivery
Continuous DeliveryContinuous Delivery
Continuous Delivery
 
Git
GitGit
Git
 
Continous delivery
Continous deliveryContinous delivery
Continous delivery
 
Hbase jdd
Hbase jddHbase jdd
Hbase jdd
 

Último

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Último (20)

presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 

Java 8: the good parts!