SlideShare ist ein Scribd-Unternehmen logo
1 von 120
Downloaden Sie, um offline zu lesen
#JavalandJavaslang @koenighotze
java
slang
The Monad strikes back
#JavalandJavaslang @koenighotze
David Schmitz - koenighotze
Senacor Technologies
Principal Architect
Programmer!
That’s me coding Scala
#JavalandJavaslang @koenighotze
What’s in it for you?
Functional programming is hip
How Javaslang helped us
Live Code - OMG!
Because
of
Beamer
#JavalandJavaslang @koenighotze
Functors,
applicatives, monads
stay home
#JavalandJavaslang @koenighotze
Code that is easier
to reason about
#JavalandJavaslang @koenighotze
Side-effects are evil
try {
int i = 1/0;
} catch (Throwable t) {
…
}
Exceptions are goto-statements
:(
#JavalandJavaslang @koenighotze
Referential Transparency
Math.random();
Math.max(1, 2);
Math.random();
Math.max(1, 2);
Pure functions are a Good ThingTm
:(
#JavalandJavaslang @koenighotze
Thinking in values
Immutability
Performance
Safety
#JavalandJavaslang @koenighotze
In a nutshell, think about
“what to code“
not
“how to code”
#JavalandJavaslang @koenighotze
Enter java Eight
(a) -> a + 2
list.stream().filter…
Excitement…
#JavalandJavaslang @koenighotze
Try filtering all
invalid users from
a list of users
#JavalandJavaslang @koenighotze
Excitement?…until
users.stream()
.filter(user -> {
try {
return user.validate();
} catch (Exception ex) {
return false;
}})
.collect(Collectors.toList());
#JavalandJavaslang @koenighotze
import static javaslang.API.*;
#JavalandJavaslang @koenighotze
What we’ll cover
Immutable collections
Some functional sugar
Pattern matching
Property based testing
Circuit breaker
#JavalandJavaslang @koenighotze
Before we get to the details…
Let’s fix that ugly code
#JavalandJavaslang @koenighotze
Fixing Things….
users.stream()
.filter(user -> {
try {
return user.validate();
} catch (Exception ex) {
return false;
}})
.collect(Collectors.toList());
#JavalandJavaslang @koenighotze
Functional collections
List.ofAll(users)
.filter(user -> {
try {
return user.validate();
} catch (Exception ex) {
return false;
}})
.collect(Collectors.toList());
#JavalandJavaslang @koenighotze
No need for Collectors
List.ofAll(users)
.filter(user -> {
try {
return user.validate();
} catch (Exception ex) {
return false;
}})
.collect(Collectors.toList());
#JavalandJavaslang @koenighotze
No need for Collectors
List.ofAll(users)
.filter(user -> {
try {
return user.validate();
} catch (Exception ex) {
return false;
}}); .collect(Collectors.toLis
t());
#JavalandJavaslang @koenighotze
Wrapping Exceptions
List.ofAll(users)
.filter(user -> {
try {
return user.validate();
} catch (Exception ex) {
return false;
}}); .collect(Collectors.toLis
t());
#JavalandJavaslang @koenighotze
Wrapping Exceptions
List.ofAll(users)
.filter(user ->
Try.of(user::validateAddress)
.getOrElse(false)
); } catch (IllegalStateException
ex) { return
); .collect(Collectors.toList();
#JavalandJavaslang @koenighotze
List.ofAll(users)
List.filter(user ->
Try.of(user::validateAddress)
.getOrElse(false));
#JavalandJavaslang @koenighotze
immutable Collections
#JavalandJavaslang @koenighotze
Mutable Collections are Evil
Returning void == Side-Effect!
interface Collection<E> {
…
void clear();
}
interface Collection<E> {
…
void clear();
}
#JavalandJavaslang @koenighotze
java.util.Collections
Collections
.unmodifiableList(list);
.add(“💥”)
#JavalandJavaslang @koenighotze
java.util.Collections
Collections
.unmodifiableList(list)
.add(“💥”);
#JavalandJavaslang @koenighotzePainting by Gustav Courbet
java.lang.UnsupportedOperationException at
java.util.Collections$UnmodifiableCollection
.add(Collections.java:1055)
at java.util.stream.AbstractPipeline.<init>
(AbstractPipeline.java:203)
at java.util.stream.ReferencePipeline.<init>
(ReferencePipeline.java:94)
#JavalandJavaslang @koenighotze
Javaslang Collections
https://cdn.infoq.com/statics_s2_20170314-0434/resource/news/2016/11/the-road-to-javaslang-3/en/resources/1infoq-version2.0-library.png
#JavalandJavaslang @koenighotze
Functional data structures
Immutable
Referentially transparent
Persistent
#JavalandJavaslang @koenighotze
heroes = List.of("Han", "Luke")
Cons@661 “Han” T
Cons@666 “Luke” ()
heroes
Effectively immutable
#JavalandJavaslang @koenighotze
Cons@661 “Han” T
Cons@666 “Luke” ()
heroes
Cons@662 “Ben” Tmore
more = heroes.prepend("Ben")
Effectively immutable
#JavalandJavaslang @koenighotze
droids =
TreeSet.of(
"C3PO",
"R2D2",
"K2SO"
)
Node@676
Node@679 Node@681“K2SO”
() ()“C3PO”
() ()“R2D2”
Effectively immutable
#JavalandJavaslang @koenighotze
droids.add("Chopper");
Effectively immutable
#JavalandJavaslang @koenighotze
Node@689
Node@691
() Node@694
() ()“Chopper”
Node@676
Node@679 Node@681“K2SO”
() ()“C3PO”
() ()“R2D2”
Effectively immutable
#JavalandJavaslang @koenighotze
old == new
Checking for updates?
#JavalandJavaslang @koenighotze
Streams are glorified iterators
Stream<String> jdk
= Stream.of("a", “B");
jdk.map(String::toUpperCase);
jdk.map(String::toLowerCase);
#JavalandJavaslang @koenighotzePainting by Gustav Courbet
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)
#JavalandJavaslang @koenighotze
Stream<String> slang =
Stream.of("a", "B");
slang.map(String::toUpperCase);
// “A”,“B”
slang.map(String::toLowerCase);
// “a”,“b”
Javaslang streams
#JavalandJavaslang @koenighotze
Javaslang Streams
Stream<String> slang =
Stream.of("a", "B");
slang.map(String::toUpperCase)
.take(2);
slang.map(String::toLowerCase)
.take(2);
#JavalandJavaslang @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”
#JavalandJavaslang @koenighotze
Better performance
Less unexpected behaviour
#Devoxx #Javaslang @koenighotze
functional Sugar
#JavalandJavaslang @koenighotze
find a user and, if
an address is
available, fetch
the user’s street
#JavalandJavaslang @koenighotze
Cascading Pile of Shame
User user = repo.findOne("id");
if (user != null) {
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
}
#JavalandJavaslang @koenighotze
optional?
Optional<User> opt =
Optional.ofNullable(user);
if (optional.isPresent()) {
User user = optional.get();
}
#JavalandJavaslang @koenighotze
And now, young
coder...
you will die.
#JavalandJavaslang @koenighotze
#JavalandJavaslang @koenighotze
map or flatmap
There is no
isPresent()
#JavalandJavaslang @koenighotze
optional or option?
Optional
#JavalandJavaslang @koenighotze
optional or option?
Option
Some None
#JavalandJavaslang @koenighotze
optional or option?
Option
Some None
Value
Iterable
#JavalandJavaslang @koenighotze
optional or option?
Option
Some None
Value
Iterable
#JavalandJavaslang @koenighotze
optional or option?
Option
Some None
Value
Iterable
Serializable
#JavalandJavaslang @koenighotze
An option is like a Gift Box
NoneSome
#JavalandJavaslang @koenighotze
Map opens the Gift Box
Map
Some Some
( )->
#JavalandJavaslang @koenighotze
nothing from nothing
( )->
Map
None None
#JavalandJavaslang @koenighotze
Fixing the Pile of Shame
User user = repo.findOne("id");
if (user != null) {
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
}
#JavalandJavaslang @koenighotze
option all the Things
User user = repo.findOne("id");
if (user != null) {
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
}
#JavalandJavaslang @koenighotze
option all the Things
Option<User> user = repo.findOne("id");
if (user != null) {
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
}
#JavalandJavaslang @koenighotze
option all the Things
Option<User> user = repo.findOne("id");
if (user != null) {
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
}
#JavalandJavaslang @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()
#JavalandJavaslang @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();
}
}
#JavalandJavaslang @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();
}
}
#JavalandJavaslang @koenighotze
repo.findOne("id")
.flatMap(User::getAddress)
.map(Address::getStreet)
.getOrElse("");
#JavalandJavaslang @koenighotze
option.of(value)
.map(nested code)
== understandable story
#JavalandJavaslang @koenighotze
working with legacy code
#JavalandJavaslang @koenighotze
Nice validation Code
public static String check(String iban){
if (validationMagic(iban)) {
return iban;
}
throw new IllegalArgumentException(“Peng”);
}
#JavalandJavaslang @koenighotze
Awesome WTF Code
String iban;
try {
iban = check(“AL47…”);
}
catch (IllegalArgumentException ex) {
iban = "";
}
#JavalandJavaslang @koenighotze
From Exceptions to options
String iban = lift(Iban::check)
.apply("AL47...")
.getOrElse("");
#JavalandJavaslang @koenighotze
From Exceptions to options
String iban = lift(Iban::check)
.apply("AL47...")
.getOrElse("");
#JavalandJavaslang @koenighotze
Wrapping Exceptions with Try
Try.of(() -> stuffToDo())
#JavalandJavaslang @koenighotze
Wrapping Exceptions with Try
Failure
Exception
Success
Result
Try.of(() -> stuffToDo())
#JavalandJavaslang @koenighotze
Exceptions to options with Try
Try.of(() -> check("AL.."))
.getOrElse("")
#JavalandJavaslang @koenighotze
Exceptions to options with Try
Try.of(() -> check("AL.."))
.getOrElse("")
#JavalandJavaslang @koenighotze
Lifting and Try-ing reduce
exception handling
clutter and side-effects
#JavalandJavaslang @koenighotze
Structural Decomposition
#JavalandJavaslang @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
#JavalandJavaslang @koenighotze
Pattern Matching Basics
Match(expression)
.of(cases)
#JavalandJavaslang @koenighotze
Cases map patterns to function
Case(pattern, function)
#JavalandJavaslang @koenighotze
Example Patterns
$() wildcard pattern
$(“foo”) equals pattern
isIn(“a”, “b”) conditional pattern
#JavalandJavaslang @koenighotze
Classic HTTP Handling
if (OK.equals(res.getStatusCode()))
{
return res.getBody();
}
return emptyList();
#JavalandJavaslang @koenighotze
HTTP Handling Fixed
*Note: some type details missing
Match(res.getStatusCode())
.of(

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

Case($(), emptyList())

);
#JavalandJavaslang @koenighotze
Match(res.getStatusCode())
.of(

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

Case($(), emptyList())

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

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

Case($(), emptyList())

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

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

Case($(), emptyList())

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

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

Case($(), emptyList())

);
*Note: some type details missing
#JavalandJavaslang @koenighotze
Matching a Try
public Try<…> fetchFromUrl(…) {
…
}
#JavalandJavaslang @koenighotze
Matching a Try
Match(fetchFromUrl(“…”))
.of(
Case(Success($()), identity()),
Case(Failure($()), emptyList())
);
#JavalandJavaslang @koenighotze
Matching a Try
Match(fetchFromUrl(“…”))
.of(
Case(Success($()), identity()),
Case(Failure($()), emptyList())
);
#JavalandJavaslang @koenighotze
Matching a Try
Match(fetchFromUrl(“…”))
.of(
Case(Success($()), identity()),
Case(Failure($()), emptyList())
);
#JavalandJavaslang @koenighotze
Presto
Match(fetchFromUrl(“…”))
.of(
Case(Success($()), identity()),
Case(Failure($()), emptyList())
);
#JavalandJavaslang @koenighotze
Pattern matching
replaces complex if-
then-else sequences
with clear expressions
#JavalandJavaslang @koenighotze
property tEST
#JavalandJavaslang @koenighotze
property Based - The idea
Describe the arguments
Describe the results
Let the olde computer prove you
wrong
#JavalandJavaslang @koenighotze
Javaslang property test
Property.def(“Add works")
.forAll(Generated Data)
.suchThat(Checked Function)
.check()
.assertIsSatisfied();
#JavalandJavaslang @koenighotze
Javaslang property test
Property.def(“Add works")
.forAll(integer(), integer())
.suchThat(
(a,b)-> calc.add(a, b) == a + b)
.check()
.assertIsSatisfied();
#JavalandJavaslang @koenighotze
Running tests
2017-03-21 10:45:59.913 INFO 45701 --- FrameworkServlet '': initialization started
2017-03-21 10:45:59.925 INFO 45701 --- FrameworkServlet '': initialization completed in 12 ms
Storing User@217b0952[username=rwxbeoigyesbeqqz,email=W`a@0c..-.--db-.T5-.2-g,
Storing User@4e6280de[username=vptafghfwuwwrwall,email=sByP@6jLA4.J.1c..5h269O3-1M6-c6...-.-,,,
Storing User@2fca282c[username=qmhkjdtvbtjzfciwcceqgzfznzkhhcokiyoipdefbr,email=Q96!@6.n8.
Storing User@64d53f0d[publicId=e9d7a121-9f23-483a-828a-f9e3045fc297,username=unflrpvztxtmi...
...
Storing User@1b10f60e[publicId=6f084c18-415c-42c4-b1a8-00c5c1fc9e67,username=xwhpdpjowirsmjym...
Storing User@4b916cc2[publicId=a2b9db2c-0189-4fe8-843d-e709ef3886fa,username=yxdidpexnayyjpzo...
Should not go boom: OK, passed 1000 tests in 3719 ms.
#JavalandJavaslang @koenighotze
Failures
Should not go boom: Falsified after 23 passed tests in 3005 ms.
java.lang.AssertionError: Expected satisfied check result but was Falsified(…,
sample = ( 풧 ꜏, 燤䠽뾌密ᵓ뫶খᄀ ꌎ ⬆鹮 라鄽뾮魨 붐맧놌 엍첮
䏨➰ìឧ寅罟 溌椡‫ﲡ‬셋欙밶ῴ‫ﯯ‬缲ꢶꇞ⌽ꪂ惗 쎂蘄펮뎷粻뵞?푠쏽쥎,
fzqlbkljxhfrghllzcthvgqiglaabihkzgsqwgfcichamyonmayiewwsfwmw
ntzvozqqydkqillhpyi, +g4@F.8yOkj.-....C6GUP..3.4.-..h-
V74.E.-----2T.z97..3f1ZM6))
#JavalandJavaslang @koenighotze
Why property Based tests?
Declarative, infinit test cases
Have you tested for all characters…
…even for 💩?
Have you tested usernames like…
౧ప唆⏑쀋䯰㨼ᮁ娤즶?搃蘸阁뺬ᡧ㫈葷㖒‫ܪ‬匘ᤫ䳴㻅
댇껓痯믶㙃銐璚풔랾ᄰ 䩰삀싲闆䩟嗀嗀侀
#JavalandJavaslang @koenighotze
functional resilience
#JavalandJavaslang @koenighotze
Circuit breaker one-o-one
Consumer Backend
#JavalandJavaslang @koenighotze
Fallback
Resilience decorator
Circuit breaker one-o-one
Closed
Open
Half-Open
Consumer
#JavalandJavaslang @koenighotze
Resilience decorator
Circuit breaker one-o-one
Closed
Open
Half-Open
Consumer
Fallback
#JavalandJavaslang @koenighotze
Fallback
Resilience decorator
Circuit breaker one-o-one
Closed
Open
Half-Open
Consumer
#JavalandJavaslang @koenighotze
Fallback
Resilience decorator
Circuit breaker one-o-one
Closed
Open
Half-Open
Consumer
#JavalandJavaslang @koenighotze
Resilience For J
BackendConsumer
Backend
Service
Resilience decorator
Circuit Breaker
Retry
Cache
#JavalandJavaslang @koenighotze
Option<…> fetchBoard(String id) {
result = restTemplate.getForEntity(…);
return Match(result.getStatusCode())
.option(…);
}
flakey functions
#JavalandJavaslang @koenighotze
Option<…> fetchBoard(String id) {
result = restTemplate.getForEntity(…);
return Match(result.getStatusCode())
.option(…);
}
flakey functions
#JavalandJavaslang @koenighotze
Decorators.ofCheckedFunction(db::fetchBoard)
.withCircuitBreaker(circuitBreaker)
.decorate();
Decorating a function
#JavalandJavaslang @koenighotze
Try.of(() -> decorated.apply(stationId))
.getOrElse(Option.of(empty()))
Functional resilience
#JavalandJavaslang @koenighotze
final celebration
#JavalandJavaslang @koenighotze
HashMap.of("Foo", "Bar",
"Qux", "Baz")
Tuple.of("Foo", 1)
String help = TODO("Implement me")
Javaslang offers much more
#JavalandJavaslang @koenighotze
Javaslang offers much more
#JavalandJavaslang @koenighotze
So, is this is the
mother of all free
lunches?
#JavalandJavaslang @koenighotze
What are the drawbacks?
#JavalandJavaslang @koenighotze
What are the drawbacks?
count(Collection-libs)
>
count(Logging-libs)
#JavalandJavaslang @koenighotze
What are the drawbacks?
Option.of(foo)
.map
.filter
.flatMap
.map
.flatMap
.getOrElse(null)
N
O
T
a
drawback!
#JavalandJavaslang @koenighotze
Wrapping up
Slick, stable, consistent API
Object-functional advantages now
Complex(?)
Version 3 coming soon!
#JavalandJavaslang @koenighotze
RESISTTHE TYRANNY OF THE
COLLECTIONS FRAMEWORK
JOIN THE RESISTANCE!
#JavalandJavaslang @koenighotze
thank
you
david.schmitz at senacor.com

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

Art of Javascript
Art of JavascriptArt of Javascript
Art of Javascript
 
The Sincerest Form of Flattery
The Sincerest Form of FlatteryThe Sincerest Form of Flattery
The Sincerest Form of Flattery
 
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
 
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
 
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
 
Core Java - Quiz Questions - Bug Hunt
Core Java - Quiz Questions - Bug HuntCore Java - Quiz Questions - Bug Hunt
Core Java - Quiz Questions - Bug Hunt
 
TDD, BDD, RSpec
TDD, BDD, RSpecTDD, BDD, RSpec
TDD, BDD, RSpec
 
Java concurrency questions and answers
Java concurrency questions and answers Java concurrency questions and answers
Java concurrency questions and answers
 
Reactive Programming with JavaScript
Reactive Programming with JavaScriptReactive Programming with JavaScript
Reactive Programming with JavaScript
 
Polyglot automation - QA Fest - 2015
Polyglot automation - QA Fest - 2015Polyglot automation - QA Fest - 2015
Polyglot automation - QA Fest - 2015
 
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 Full Throttle
Java Full ThrottleJava Full Throttle
Java Full Throttle
 
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
 
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
 
JavaScript Functions
JavaScript FunctionsJavaScript Functions
JavaScript Functions
 
Functional Javascript
Functional JavascriptFunctional Javascript
Functional Javascript
 
Structure on a freeform world
Structure on a freeform worldStructure on a freeform world
Structure on a freeform world
 

Andere mochten auch

Building a Spring Boot Application - Ask the Audience! (from JavaLand 2017)
Building a Spring Boot Application - Ask the Audience!  (from JavaLand 2017)Building a Spring Boot Application - Ask the Audience!  (from JavaLand 2017)
Building a Spring Boot Application - Ask the Audience! (from JavaLand 2017)
🎤 Hanno Embregts 🎸
 
Model of risk and return
Model of risk and returnModel of risk and return
Model of risk and return
Teguh Pribadi
 

Andere mochten auch (20)

10 Tips for failing at microservices
10 Tips for failing at microservices10 Tips for failing at microservices
10 Tips for failing at microservices
 
Migrating to Java 9 Modules
Migrating to Java 9 ModulesMigrating to Java 9 Modules
Migrating to Java 9 Modules
 
JavaLand 2017 - Pipeline as code
JavaLand 2017 - Pipeline as codeJavaLand 2017 - Pipeline as code
JavaLand 2017 - Pipeline as code
 
Project Panama - Beyond the (JVM) Wall
Project Panama - Beyond the (JVM) WallProject Panama - Beyond the (JVM) Wall
Project Panama - Beyond the (JVM) Wall
 
Javaslang - Functional Sugar For Java
Javaslang - Functional Sugar For JavaJavaslang - Functional Sugar For Java
Javaslang - Functional Sugar For Java
 
Welcome alexa, your personal assistant
Welcome alexa, your personal assistantWelcome alexa, your personal assistant
Welcome alexa, your personal assistant
 
Building a Spring Boot Application - Ask the Audience! (from JavaLand 2017)
Building a Spring Boot Application - Ask the Audience!  (from JavaLand 2017)Building a Spring Boot Application - Ask the Audience!  (from JavaLand 2017)
Building a Spring Boot Application - Ask the Audience! (from JavaLand 2017)
 
FULL/HOJA INFORMATIU/ INFORMATIVA 170329 CGT
FULL/HOJA INFORMATIU/ INFORMATIVA 170329 CGTFULL/HOJA INFORMATIU/ INFORMATIVA 170329 CGT
FULL/HOJA INFORMATIU/ INFORMATIVA 170329 CGT
 
Retailers, Meet the Centennials
Retailers, Meet the CentennialsRetailers, Meet the Centennials
Retailers, Meet the Centennials
 
Model of risk and return
Model of risk and returnModel of risk and return
Model of risk and return
 
Rapid Application Development with Docker
Rapid Application Development with DockerRapid Application Development with Docker
Rapid Application Development with Docker
 
Social media for recruitng 1
Social media for recruitng 1Social media for recruitng 1
Social media for recruitng 1
 
Secuencia de actividades inteligencias multiples
Secuencia de actividades inteligencias multiplesSecuencia de actividades inteligencias multiples
Secuencia de actividades inteligencias multiples
 
Distribution and ex dividend dates-upto 28 mar-2017
Distribution and ex dividend dates-upto 28 mar-2017Distribution and ex dividend dates-upto 28 mar-2017
Distribution and ex dividend dates-upto 28 mar-2017
 
Entreprendre
EntreprendreEntreprendre
Entreprendre
 
الادارة الرياضية
الادارة الرياضيةالادارة الرياضية
الادارة الرياضية
 
Science for Peace – Equal Education to Everyone!
Science for Peace – Equal Education to Everyone!Science for Peace – Equal Education to Everyone!
Science for Peace – Equal Education to Everyone!
 
Sustaining Scholarly Infrastructures through Collective Action: The lessons t...
Sustaining Scholarly Infrastructures through Collective Action: The lessons t...Sustaining Scholarly Infrastructures through Collective Action: The lessons t...
Sustaining Scholarly Infrastructures through Collective Action: The lessons t...
 
Fast Fish Forum key take-outs 15 Mar 2017
Fast Fish Forum key take-outs 15 Mar 2017Fast Fish Forum key take-outs 15 Mar 2017
Fast Fish Forum key take-outs 15 Mar 2017
 
Pravin Rajpal on How to Drive Innovation Driven Growth & Market Leadership
Pravin Rajpal on How to Drive Innovation Driven Growth & Market LeadershipPravin Rajpal on How to Drive Innovation Driven Growth & Market Leadership
Pravin Rajpal on How to Drive Innovation Driven Growth & Market Leadership
 

Ähnlich wie Javaslang Talk @ Javaland 2017

Ähnlich wie Javaslang Talk @ Javaland 2017 (20)

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
 
JavaOne 2017 - JNoSQL: The Definitive Solution for Java and NoSQL Database [C...
JavaOne 2017 - JNoSQL: The Definitive Solution for Java and NoSQL Database [C...JavaOne 2017 - JNoSQL: The Definitive Solution for Java and NoSQL Database [C...
JavaOne 2017 - JNoSQL: The Definitive Solution for Java and NoSQL Database [C...
 
Clojure class
Clojure classClojure class
Clojure class
 
Vavr Java User Group Rheinland
Vavr Java User Group RheinlandVavr Java User Group Rheinland
Vavr Java User Group Rheinland
 
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)
 
Nantes Jug - Java 7
Nantes Jug - Java 7Nantes Jug - Java 7
Nantes Jug - Java 7
 
Kotlin – the future of android
Kotlin – the future of androidKotlin – the future of android
Kotlin – the future of android
 
To inject or not to inject: CDI is the question
To inject or not to inject: CDI is the questionTo inject or not to inject: CDI is the question
To inject or not to inject: CDI is the question
 
Kotlin: forse è la volta buona (Trento)
Kotlin: forse è la volta buona (Trento)Kotlin: forse è la volta buona (Trento)
Kotlin: forse è la volta buona (Trento)
 
jQuery & 10,000 Global Functions: Working with Legacy JavaScript
jQuery & 10,000 Global Functions: Working with Legacy JavaScriptjQuery & 10,000 Global Functions: Working with Legacy JavaScript
jQuery & 10,000 Global Functions: Working with Legacy JavaScript
 
Crossing the Bridge: Connecting Rails and your Front-end Framework
Crossing the Bridge: Connecting Rails and your Front-end FrameworkCrossing the Bridge: Connecting Rails and your Front-end Framework
Crossing the Bridge: Connecting Rails and your Front-end Framework
 
Beyond java8
Beyond java8Beyond java8
Beyond java8
 
Боремся с NPE вместе с Kotlin, Павел Шацких СберТех
Боремся с NPE вместе с Kotlin, Павел Шацких СберТехБоремся с NPE вместе с Kotlin, Павел Шацких СберТех
Боремся с NPE вместе с Kotlin, Павел Шацких СберТех
 
Scala ntnu
Scala ntnuScala ntnu
Scala ntnu
 
Functional Java 8 - Introduction
Functional Java 8 - IntroductionFunctional Java 8 - Introduction
Functional Java 8 - Introduction
 
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
 
Scala uma poderosa linguagem para a jvm
Scala   uma poderosa linguagem para a jvmScala   uma poderosa linguagem para a jvm
Scala uma poderosa linguagem para a jvm
 
An Emoji Introduction to React Native (Panagiotis Vourtsis, Senior Front End ...
An Emoji Introduction to React Native (Panagiotis Vourtsis, Senior Front End ...An Emoji Introduction to React Native (Panagiotis Vourtsis, Senior Front End ...
An Emoji Introduction to React Native (Panagiotis Vourtsis, Senior Front End ...
 
Why you should be using the shiny new C# 6.0 features now!
Why you should be using the shiny new C# 6.0 features now!Why you should be using the shiny new C# 6.0 features now!
Why you should be using the shiny new C# 6.0 features now!
 
Not your father's tests
Not your father's testsNot your father's tests
Not your father's tests
 

Mehr von David Schmitz

Mehr von David Schmitz (13)

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)
 
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
 
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
 
Docker for the Brave
Docker for the BraveDocker for the Brave
Docker for the Brave
 
Spring boot - Getting Started
Spring boot - Getting StartedSpring boot - Getting Started
Spring boot - Getting Started
 

Kürzlich hochgeladen

Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 

Kürzlich hochgeladen (20)

08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
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?
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
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)
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 

Javaslang Talk @ Javaland 2017