SlideShare una empresa de Scribd logo
1 de 97
Descargar para leer sin conexión
#Devoxx #Javaslang @koenighotze
JΛVΛSLΛNGFunctional Sugar For Java
#Devoxx #Javaslang @koenighotze
Senacor Technologies
Programmer!
That’s me coding Scala
David Schmitz / @koenighotze
Senacor Technologies
Programmer!
That’s me coding Scala
#Devoxx #Javaslang @koenighotze
What’s in it for you?
Functional programming is hip
How Javaslang helped us
Examples, Code!
#Devoxx #Javaslang @koenighotze
Functors,
applicatives,
monads and friends
stay home
#Devoxx #Javaslang @koenighotze
Code that is easier to
reason about
#Devoxx #Javaslang @koenighotze
Side-effects are evil
try {
int i = 1/0;
} catch (Throwable t) {
…
}
Exceptions are goto-statements
:(
#Devoxx #Javaslang @koenighotze
Referential Transparency
Math.random();
Math.max(1, 2);
Math.random();
Math.max(1, 2);
Pure functions are a Good ThingTm
:(
#Devoxx #Javaslang @koenighotze
Thinking in Values
Immutability
Performance
Safety
#Devoxx #Javaslang @koenighotze
In a nutshell, think about
“what to code“
not
“how to code”
#Devoxx #Javaslang @koenighotze
Enter Java 8
(a) -> a + 2
list.stream().filter…
Excitement…
#Devoxx #Javaslang @koenighotze
“Try filtering all invalid users
from a list of users”
#Devoxx #Javaslang @koenighotze
Excitement?…until
users.stream()
.filter(user -> {
try {
return user.validate();
} catch (Exception ex) {
return false;
}})
.collect(Collectors.toList());
#Devoxx #Javaslang @koenighotzePainting by Gustav Courbet
#Devoxx #Javaslang @koenighotze
import static javaslang.API.*;
+
#Devoxx #Javaslang @koenighotze
What we’ll cover
Immutable collections
Some functional sugar
Pattern matching
#Devoxx #Javaslang @koenighotze
Before we get to the details…
Let’s fix that ugly code
#Devoxx #Javaslang @koenighotze
Fixing Things….
users.stream()
.filter(user -> {
try {
return user.validate();
} catch (Exception ex) {
return false;
}})
.collect(Collectors.toList());
#Devoxx #Javaslang @koenighotze
Functional collections
List.ofAll(users)
.filter(user -> {
try {
return user.validate();
} catch (Exception ex) {
return false;
}})
.collect(Collectors.toList());
#Devoxx #Javaslang @koenighotze
No need for Collectors
List.ofAll(users)
.filter(user -> {
try {
return user.validate();
} catch (Exception ex) {
return false;
}})
.collect(Collectors.toList());
#Devoxx #Javaslang @koenighotze
No need for Collectors
List.ofAll(users)
.filter(user -> {
try {
return user.validate();
} catch (Exception ex) {
return false;
}}); .collect(Collectors.toLis
t());
#Devoxx #Javaslang @koenighotze
Wrapping Exceptions
List.ofAll(users)
.filter(user -> {
try {
return user.validate();
} catch (Exception ex) {
return false;
}}); .collect(Collectors.toLis
t());
#Devoxx #Javaslang @koenighotze
Wrapping Exceptions
List.ofAll(users)
.filter(user ->
Try.of(user::validateAddress)
.getOrElse(false)
); } catch (IllegalStateException
ex) { return
); .collect(Collectors.toList();
#Devoxx #Javaslang @koenighotze
List.ofAll(users)
List.filter(user ->
Try.of(user::validateAddress)
.getOrElse(false));
“Try filtering all invalid users
from a list of users”
#Devoxx #Javaslang @koenighotze
Immutable Collections
Image by Douglas Muth, https://flic.kr/p/acFwxG
#Devoxx #Javaslang @koenighotze
Mutable Collections are Evil
Returning void == Side-Effect!
interface Collection<E> {
…
void clear();
}
interface Collection<E> {
…
void clear();
}
#Devoxx #Javaslang @koenighotze
Easy solution? Collections
Collections
.unmodifiableList(list);
.add("BUMM");
#Devoxx #Javaslang @koenighotze
Easy solution? Collections
Collections
.unmodifiableList(list)
.add("BUMM");
#Devoxx #Javaslang @koenighotze
#Devoxx #Javaslang @koenighotze
Javaslang Collections
List<~> t = List.of(“F95”);
List<~> t2 = t.append(withName(“FCK”));
F95 /t
#Devoxx #Javaslang @koenighotze
Immutable
List<~> t = List.of(“F95”);
List<~> t2 = t.prepend(“FCK”);
F95 /t
FCKt2
#Devoxx #Javaslang @koenighotze
List<~> t = List.of(“F95”);
List<~> t2 = t.prepend(“FCK”);
F95 /
FCK
t
t2
Persistent and Efficient
#Devoxx #Javaslang @koenighotze
Streams are glorified Iterators
Stream<String> jdk
= Stream.of("a", “B");
jdk.map(String::toUpperCase);
jdk.map(String::toLowerCase);
#Devoxx #Javaslang @koenighotze
java.lang.IllegalStateException:
stream has already been operated upon
or closed
at java.util.stream.AbstractPipeline.<init>(AbstractPipeline.java:203)
at java.util.stream.ReferencePipeline.<init>(ReferencePipeline.java:94)
at
java.util.stream.ReferencePipeline$StatelessOp.<init>(ReferencePipeline.java
:618)
at java.util.stream.ReferencePipeline$3.<init>(ReferencePipeline.java:187)
at java.util.stream.ReferencePipeline.map(ReferencePipeline.java:186)
#Devoxx #Javaslang @koenighotze
Javaslang Streams
Stream<String> slang =
Stream.of("a", "B");
slang.map(String::toUpperCase);
// “A”,“B”
slang.map(String::toLowerCase);
// “a”,“b”
#Devoxx #Javaslang @koenighotze
Javaslang Streams
Stream<String> slang =
Stream.of("a", "B");
slang.map(String::toUpperCase)
.take(2);
slang.map(String::toLowerCase)
.take(2);
#Devoxx #Javaslang @koenighotze
Javaslang Streams
Stream<String> slang =
Stream.of("a", "B");
slang.map(String::toUpperCase)
.take(2);// “A”,“B”
slang.map(String::toLowerCase)
.take(2);// “a”,“b”
#Devoxx #Javaslang @koenighotze
Functional data structures
improve performance and
reduce the chance of
unexpected behaviour
#Devoxx #Javaslang @koenighotze
Functional Sugar
#Devoxx #Javaslang @koenighotze
“Find a user and, if an
address is available, fetch
the user’s street”
#Devoxx #Javaslang @koenighotze
Cascading Pile of Shame
User user = repo.findOne("id");
if (user != null) {
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
}
#Devoxx #Javaslang @koenighotze
We’ve got java.util.Optional
Optional<User> opt =
Optional.ofNullable(user);
if (optional.isPresent()) {
…
}
#Devoxx #Javaslang @koenighotze
#Devoxx #Javaslang @koenighotze
Please stop using
Optional#isPresent()
#Devoxx #Javaslang @koenighotze
An Option is like a Gift Box
NoneSome
#Devoxx #Javaslang @koenighotze
Map opens the Gift Box
Map
Some Some
( )->
#Devoxx #Javaslang @koenighotze
Nothing from Nothing
( )->
Map
None None
#Devoxx #Javaslang @koenighotze
Optional or Option?
Optional
#Devoxx #Javaslang @koenighotze
Optional or Option?
Option
Some None
#Devoxx #Javaslang @koenighotze
Optional or Option?
Option
Some None
Value
Iterable
#Devoxx #Javaslang @koenighotze
Optional or Option?
Option
Some None
Value
Iterable
#Devoxx #Javaslang @koenighotze
Optional or Option?
Option
Some None
Value
Iterable
Serializable
#Devoxx #Javaslang @koenighotze
Fixing the Pile of Shame
User user = repo.findOne("id");
if (user != null) {
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
}
#Devoxx #Javaslang @koenighotze
Option all the Things
User user = repo.findOne("id");
if (user != null) {
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
}
#Devoxx #Javaslang @koenighotze
Option all the Things
Option<User> user = repo.findOne("id");
if (user != null) {
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
}
#Devoxx #Javaslang @koenighotze
Option all the Things
Option<User> user = repo.findOne("id");
if (user != null) {
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
}
#Devoxx #Javaslang @koenighotze
Option all the Things
Option<User> user = repo.findOne("id");
user.flatMap(User::getAddress)
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
}
Option<User> user = repo.findOne("id");
user.flatMap(User::getAddress)
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
} Option<Address> getAddress()
#Devoxx #Javaslang @koenighotze
Option all the Things
Option<User> user = repo.findOne("id");
user.flatMap(User::getAddress)
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
}
#Devoxx #Javaslang @koenighotze
Option all the Things
Option<User> user = repo.findOne("id");
user.flatMap(User::getAddress)
Address address = user.getAddress();
.map(Address::getStreet)
return address.getStreet();
}
}
#Devoxx #Javaslang @koenighotze
repo.findOne("id")
.flatMap(User::getAddress)
.map(Address::getStreet)
.getOrElse("");
“Find a user and, if an address is
available, fetch the user’s street”
#Devoxx #Javaslang @koenighotze
Option and map transform
nested code into an
understandable story
#Devoxx #Javaslang @koenighotze
Working with legacy code
Painting by Eero Järnefelt
#Devoxx #Javaslang @koenighotze
Nice Validation Code
public static String check(String iban){
if (validationMagic(iban)) {
return iban;
}
throw new IllegalArgumentException(“Peng”);
}
#Devoxx #Javaslang @koenighotze
Awesome WTF Code
String iban;
try {
iban = check("AL47");
}
catch (IllegalArgumentException ex) {
iban = "";
}
#Devoxx #Javaslang @koenighotze
From Exceptions to Options
String iban = lift(Iban::check)
.apply("AL47...")
.getOrElse("");
#Devoxx #Javaslang @koenighotze
From Exceptions to Options
String iban = lift(Iban::check)
.apply("AL47...")
.getOrElse("");
#Devoxx #Javaslang @koenighotze
Wrapping Exceptions with Try
Try.of(() -> stuffToDo())
#Devoxx #Javaslang @koenighotze
Wrapping Exceptions with Try
Failure
Exception
Success
Result
Try.of(() -> stuffToDo())
#Devoxx #Javaslang @koenighotze
Exceptions to Options with Try
Try.of(() -> check("AL.."))
.getOrElse("")
#Devoxx #Javaslang @koenighotze
Exceptions to Options with Try
Try.of(() -> check("AL.."))
.getOrElse("")
#Devoxx #Javaslang @koenighotze
Lifting and Try-ing reduce
exception handling clutter
and side-effects
#Devoxx #Javaslang @koenighotze
Structural Decomposition
Image by Arend, https://flic.kr/p/pkBe4g
#Devoxx #Javaslang @koenighotze
Classic HTTP Handling
if (OK.equals(res.getStatusCode()))
{
return res.getBody();
}
return emptyList();
#Devoxx #Javaslang @koenighotze
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?
^_`{|}~-]+)*|"(?:[x01-x08x0bx0cx0e-x1fx21x23-
x5bx5d-x7f]|[x01-x09x0bx0cx0e-x7f])*")@(?:(?:
[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-
z0-9-]*[a-z0-9])?|[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]
[0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-
z0-9-]*[a-z0-9]:(?:[x01-x08x0bx0cx0e-x1fx21-
x5ax53-x7f]|[x01-x09x0bx0cx0e-x7f])+)])
Pattern Matching Basics
#Devoxx #Javaslang @koenighotze
Pattern Matching Basics
Match(expression)
.of(cases)
#Devoxx #Javaslang @koenighotze
Cases map functions to patterns
Case(pattern, function)
#Devoxx #Javaslang @koenighotze
Example Patterns
$() wildcard pattern
$(“foo”) equals pattern
isIn(“a”, “b”) conditional pattern
#Devoxx #Javaslang @koenighotze
HTTP Handling Fixed
*Note: some type details missing
Match(res.getStatusCode())
.of(

Case($(OK), res.getBody()),

Case($(), emptyList())

);
#Devoxx #Javaslang @koenighotze
Match(res.getStatusCode())
.of(

Case($(OK), res.getBody()),

Case($(), emptyList())

);
HTTP Handling Fixed
*Note: some type details missing
OK or anything else
#Devoxx #Javaslang @koenighotze
HTTP Handling Fixed
*Note: some type details missing
Match(res.getStatusCode())
.of(

Case($(OK), res.getBody()),

Case($(), emptyList())

);
#Devoxx #Javaslang @koenighotze
HTTP Handling Fixed
*Note: some type details missing
Match(res.getStatusCode())
.of(

Case($(OK), res.getBody()),

Case($(), emptyList())

);
#Devoxx #Javaslang @koenighotze
HTTP Handling Fixed
Match(res.getStatusCode())
.of(

Case($(OK), res.getBody()),

Case($(), emptyList())

);
*Note: some type details missing
#Devoxx #Javaslang @koenighotze
Matching a Try
public Try<…> fetchFromUrl(…) {
…
}
#Devoxx #Javaslang @koenighotze
Matching a Try
Match(fetchFromUrl(“…”))
.of(
Case(Success($()), identity()),
Case(Failure($()), emptyList())
);
#Devoxx #Javaslang @koenighotze
Matching a Try
Match(fetchFromUrl(“…”))
.of(
Case(Success($()), identity()),
Case(Failure($()), emptyList())
);
#Devoxx #Javaslang @koenighotze
Matching a Try
Match(fetchFromUrl(“…”))
.of(
Case(Success($()), identity()),
Case(Failure($()), emptyList())
);
#Devoxx #Javaslang @koenighotze
Presto!
Match(fetchFromUrl(“…”))
.of(
Case(Success($()), identity()),
Case(Failure($()), emptyList())
);
#Devoxx #Javaslang @koenighotze
Pattern matching
replaces complex if-
then-else sequences
with clear expressions
#Devoxx #Javaslang @koenighotze
HashMap.of("Foo", "Bar",
"Qux", "Baz")
.bimap(String::toLowerCase,
String::toUpperCase)
.get("qux"); // BAZ
Javaslang offers much more
#Devoxx #Javaslang @koenighotze
Javaslang offers much more
Tuple.of("Foo", 1)
.map((s, i) ->
Tuple.of(s + "Bar",
i + 5))
// “FooBar”, 6
#Devoxx #Javaslang @koenighotze
Javaslang offers much more
#Devoxx #Javaslang @koenighotze
So, is this is the mother
of all free lunches?
#Devoxx #Javaslang @koenighotze
What are the drawbacks?
#Devoxx #Javaslang @koenighotze
What are the drawbacks?
count(Collection-libs)
>
count(Logging-libs)
#Devoxx #Javaslang @koenighotze
What are the drawbacks?
Option.of(foo)
.map
.filter
.flatMap
#Devoxx #Javaslang @koenighotze
Wrapping up
Slick, stable, consistent API
Object-functional
Complex(?)
Version 3 in 2017
#Devoxx #Javaslang @koenighotze
.iohttp://
Do you want to know more?
#Devoxx #Javaslang @koenighotze
Thank You!
<david.schmitz@senacor.com>

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

Lambda and Stream Master class - part 1
Lambda and Stream Master class - part 1Lambda and Stream Master class - part 1
Lambda and Stream Master class - part 1
 
The Sincerest Form of Flattery
The Sincerest Form of FlatteryThe Sincerest Form of Flattery
The Sincerest Form of Flattery
 
Art of Javascript
Art of JavascriptArt of Javascript
Art of Javascript
 
Selenide alternative in Python - Introducing Selene [SeleniumCamp 2016]
Selenide alternative in Python - Introducing Selene [SeleniumCamp 2016]Selenide alternative in Python - Introducing Selene [SeleniumCamp 2016]
Selenide alternative in Python - Introducing Selene [SeleniumCamp 2016]
 
You do not need automation engineer - Sqa Days - 2015 - EN
You do not need automation engineer  - Sqa Days - 2015 - ENYou do not need automation engineer  - Sqa Days - 2015 - EN
You do not need automation engineer - Sqa Days - 2015 - EN
 
TDD, BDD, RSpec
TDD, BDD, RSpecTDD, BDD, RSpec
TDD, BDD, RSpec
 
Core Java - Quiz Questions - Bug Hunt
Core Java - Quiz Questions - Bug HuntCore Java - Quiz Questions - Bug Hunt
Core Java - Quiz Questions - Bug Hunt
 
Lambda Chops - Recipes for Simpler, More Expressive Code
Lambda Chops - Recipes for Simpler, More Expressive CodeLambda Chops - Recipes for Simpler, More Expressive Code
Lambda Chops - Recipes for Simpler, More Expressive Code
 
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
 
Java concurrency questions and answers
Java concurrency questions and answers Java concurrency questions and answers
Java concurrency questions and answers
 
Polyglot automation - QA Fest - 2015
Polyglot automation - QA Fest - 2015Polyglot automation - QA Fest - 2015
Polyglot automation - QA Fest - 2015
 
Functional Programming Patterns (NDC London 2014)
Functional Programming Patterns (NDC London 2014)Functional Programming Patterns (NDC London 2014)
Functional Programming Patterns (NDC London 2014)
 
Dr Frankenfunctor and the Monadster
Dr Frankenfunctor and the MonadsterDr Frankenfunctor and the Monadster
Dr Frankenfunctor and the Monadster
 
Java Full Throttle
Java Full ThrottleJava Full Throttle
Java Full Throttle
 
Reactive Programming with JavaScript
Reactive Programming with JavaScriptReactive Programming with JavaScript
Reactive Programming with JavaScript
 
React Native One Day
React Native One DayReact Native One Day
React Native One Day
 
JavaScript in 2016
JavaScript in 2016JavaScript in 2016
JavaScript in 2016
 
JavaScript Functions
JavaScript FunctionsJavaScript Functions
JavaScript Functions
 
Functional Javascript
Functional JavascriptFunctional Javascript
Functional Javascript
 
Write code that writes code!
Write code that writes code!Write code that writes code!
Write code that writes code!
 

Destacado

Destacado (8)

Elixir - Easy fun for busy developers @ Devoxx 2016
Elixir - Easy fun for busy developers @ Devoxx 2016Elixir - Easy fun for busy developers @ Devoxx 2016
Elixir - Easy fun for busy developers @ Devoxx 2016
 
10 Tips for failing at microservices
10 Tips for failing at microservices10 Tips for failing at microservices
10 Tips for failing at microservices
 
Spring boot - Getting Started
Spring boot - Getting StartedSpring boot - Getting Started
Spring boot - Getting Started
 
Javaslang - Functional Sugar For Java
Javaslang - Functional Sugar For JavaJavaslang - Functional Sugar For Java
Javaslang - Functional Sugar For Java
 
Docker for the Brave
Docker for the BraveDocker for the Brave
Docker for the Brave
 
Bootstrap |> Elixir - Easy fun for busy developers
Bootstrap |> Elixir - Easy fun for busy developersBootstrap |> Elixir - Easy fun for busy developers
Bootstrap |> Elixir - Easy fun for busy developers
 
Resilience testing with Wiremock and Spock
Resilience testing with Wiremock and SpockResilience testing with Wiremock and Spock
Resilience testing with Wiremock and Spock
 
How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your Niche
 

Similar a Javaslang @ Devoxx

Evolving a Clean, Pragmatic Architecture - A Craftsman's Guide
Evolving a Clean, Pragmatic Architecture - A Craftsman's GuideEvolving a Clean, Pragmatic Architecture - A Craftsman's Guide
Evolving a Clean, Pragmatic Architecture - A Craftsman's Guide
Victor Rentea
 

Similar a Javaslang @ Devoxx (20)

Clojure class
Clojure classClojure class
Clojure class
 
SoTWLG Intro to Code Bootcamps 2016 (Roger Nesbitt)
SoTWLG Intro to Code Bootcamps 2016 (Roger Nesbitt)SoTWLG Intro to Code Bootcamps 2016 (Roger Nesbitt)
SoTWLG Intro to Code Bootcamps 2016 (Roger Nesbitt)
 
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
 
Droidcon ES '16 - How to fail going offline
Droidcon ES '16 - How to fail going offlineDroidcon ES '16 - How to fail going offline
Droidcon ES '16 - How to fail going offline
 
Vavr Java User Group Rheinland
Vavr Java User Group RheinlandVavr Java User Group Rheinland
Vavr Java User Group Rheinland
 
TDD and mobile development: some forgotten techniques, illustrated with Android
TDD and mobile development: some forgotten techniques, illustrated with AndroidTDD and mobile development: some forgotten techniques, illustrated with Android
TDD and mobile development: some forgotten techniques, illustrated with Android
 
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?
 
What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)
 
Handlebars
HandlebarsHandlebars
Handlebars
 
Matteo Vaccari - TDD per Android | Codemotion Milan 2015
Matteo Vaccari - TDD per Android | Codemotion Milan 2015Matteo Vaccari - TDD per Android | Codemotion Milan 2015
Matteo Vaccari - TDD per Android | Codemotion Milan 2015
 
Evolving a Clean, Pragmatic Architecture - A Craftsman's Guide
Evolving a Clean, Pragmatic Architecture - A Craftsman's GuideEvolving a Clean, Pragmatic Architecture - A Craftsman's Guide
Evolving a Clean, Pragmatic Architecture - A Craftsman's Guide
 
Having Fun with Play
Having Fun with PlayHaving Fun with Play
Having Fun with Play
 
Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014
Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014
Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014
 
Java9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidadJava9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidad
 
Rails by example
Rails by exampleRails by example
Rails by example
 
Dartprogramming
DartprogrammingDartprogramming
Dartprogramming
 
Ruby on Rails
Ruby on RailsRuby on Rails
Ruby on Rails
 
JDD 2016 - Sebastian Malaca - You Dont Need Unit Tests
JDD 2016 - Sebastian Malaca - You Dont Need Unit TestsJDD 2016 - Sebastian Malaca - You Dont Need Unit Tests
JDD 2016 - Sebastian Malaca - You Dont Need Unit Tests
 
Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017
Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017 Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017
Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017
 
jQuery introduction
jQuery introductionjQuery introduction
jQuery introduction
 

Más de David Schmitz

Más de David Schmitz (8)

Going Cloud Native
Going Cloud NativeGoing Cloud Native
Going Cloud Native
 
Eventsourcing you-are-doing-it-wrong-vxdparis
Eventsourcing you-are-doing-it-wrong-vxdparisEventsourcing you-are-doing-it-wrong-vxdparis
Eventsourcing you-are-doing-it-wrong-vxdparis
 
Event Sourcing - You are doing it wrong @ Devoxx
Event Sourcing - You are doing it wrong @ DevoxxEvent Sourcing - You are doing it wrong @ Devoxx
Event Sourcing - You are doing it wrong @ Devoxx
 
10 Tipps für ein absolutes Microservice-Desaster
10 Tipps für ein absolutes Microservice-Desaster10 Tipps für ein absolutes Microservice-Desaster
10 Tipps für ein absolutes Microservice-Desaster
 
10 tips for failing at microservices @ DevExperience 2018
10 tips for failing at microservices @ DevExperience 201810 tips for failing at microservices @ DevExperience 2018
10 tips for failing at microservices @ DevExperience 2018
 
Real world serverless - architecture, patterns and lessons learned
Real world serverless - architecture, patterns and lessons learnedReal world serverless - architecture, patterns and lessons learned
Real world serverless - architecture, patterns and lessons learned
 
The FaaS and the Furious
The FaaS and the FuriousThe FaaS and the Furious
The FaaS and the Furious
 
10 Tips for failing at microservices - badly (BedCon 2017)
10 Tips for failing at microservices - badly (BedCon 2017)10 Tips for failing at microservices - badly (BedCon 2017)
10 Tips for failing at microservices - badly (BedCon 2017)
 

Último

Standard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power PlayStandard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power Play
Epec Engineered Technologies
 
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
dharasingh5698
 
notes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.pptnotes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.ppt
MsecMca
 
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
dharasingh5698
 
Integrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - NeometrixIntegrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - Neometrix
Neometrix_Engineering_Pvt_Ltd
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
dollysharma2066
 
Top Rated Call Girls In chittoor 📱 {7001035870} VIP Escorts chittoor
Top Rated Call Girls In chittoor 📱 {7001035870} VIP Escorts chittoorTop Rated Call Girls In chittoor 📱 {7001035870} VIP Escorts chittoor
Top Rated Call Girls In chittoor 📱 {7001035870} VIP Escorts chittoor
dharasingh5698
 
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort ServiceCall Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 

Último (20)

Standard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power PlayStandard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power Play
 
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
 
notes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.pptnotes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.ppt
 
Unit 1 - Soil Classification and Compaction.pdf
Unit 1 - Soil Classification and Compaction.pdfUnit 1 - Soil Classification and Compaction.pdf
Unit 1 - Soil Classification and Compaction.pdf
 
Bhosari ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready For ...
Bhosari ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready For ...Bhosari ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready For ...
Bhosari ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready For ...
 
Employee leave management system project.
Employee leave management system project.Employee leave management system project.
Employee leave management system project.
 
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
 
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
 
2016EF22_0 solar project report rooftop projects
2016EF22_0 solar project report rooftop projects2016EF22_0 solar project report rooftop projects
2016EF22_0 solar project report rooftop projects
 
Thermal Engineering-R & A / C - unit - V
Thermal Engineering-R & A / C - unit - VThermal Engineering-R & A / C - unit - V
Thermal Engineering-R & A / C - unit - V
 
COST-EFFETIVE and Energy Efficient BUILDINGS ptx
COST-EFFETIVE  and Energy Efficient BUILDINGS ptxCOST-EFFETIVE  and Energy Efficient BUILDINGS ptx
COST-EFFETIVE and Energy Efficient BUILDINGS ptx
 
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...
 
A Study of Urban Area Plan for Pabna Municipality
A Study of Urban Area Plan for Pabna MunicipalityA Study of Urban Area Plan for Pabna Municipality
A Study of Urban Area Plan for Pabna Municipality
 
Unleashing the Power of the SORA AI lastest leap
Unleashing the Power of the SORA AI lastest leapUnleashing the Power of the SORA AI lastest leap
Unleashing the Power of the SORA AI lastest leap
 
Integrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - NeometrixIntegrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - Neometrix
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
 
Generative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPTGenerative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPT
 
Top Rated Call Girls In chittoor 📱 {7001035870} VIP Escorts chittoor
Top Rated Call Girls In chittoor 📱 {7001035870} VIP Escorts chittoorTop Rated Call Girls In chittoor 📱 {7001035870} VIP Escorts chittoor
Top Rated Call Girls In chittoor 📱 {7001035870} VIP Escorts chittoor
 
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
 
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort ServiceCall Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
 

Javaslang @ Devoxx