SlideShare ist ein Scribd-Unternehmen logo
1 von 157
Downloaden Sie, um offline zu lesen
@koenighotze
Revenge of the JavaSlang
@koenighotze
David Schmitz
@Koenighotze
Senacor Technologies
@koenighotze
@koenighotze
Finding a new name
@koenighotze
@koenighotze
@koenighotze
What’s in it for you?
@koenighotze
Functional programming is hip
How VAVR helped us
Some awful code - OMG!
@koenighotze
Functors, applicatives, monads
stay home
@koenighotze
Code that is easier to
reason about
@koenighotze
Side-effects are evil
@koenighotze
try {
int i = 1/0;
} catch (Throwable t) {
…
}
Exceptions are goto-statements
:(
@koenighotze
Referential
transparency
@koenighotze
Math.random();
Math.max(1, 2);
Math.random();
Math.max(1, 2);
Pure functions are a Good ThingTm
:(
@koenighotze
Thinking in values
@koenighotze
Immutability
Performance
Safety
@koenighotze
In a nutshell, think about
“what to code“
not
“how to code”
@koenighotze
Enter Java 8
@koenighotze
(a) -> a + 2
list.stream().filter…
Excitement…
@koenighotze
Try filtering all invalid
users from a list of users
@koenighotze
users.stream()
.filter(user -> {
try {
return user.validate();
} catch (Exception ex) {
return false;
}})
.collect(Collectors.toList());
@koenighotzePainting by Gustav Courbet
WAAAAAAT?
@koenighotze
import static
io.vavr.API.*;
@koenighotze
Immutable collections
Some functional sugar
Functional exception handling
@koenighotze
Before we get to the
details…
Let’s fix that ugly code
@koenighotze
users.stream()
.filter(user -> {
try {
return user.validate();
} catch (Exception ex) {
return false;
}})
.collect(Collectors.toList());
@koenighotze
List.ofAll(users)
.filter(user -> {
try {
return user.validate();
} catch (Exception ex) {
return false;
}})
.collect(Collectors.toList());
@koenighotze
List.ofAll(users)
.filter(user -> {
try {
return user.validate();
} catch (Exception ex) {
return false;
}})
.collect(Collectors.toList());
@koenighotze
List.ofAll(users)
.filter(user -> {
try {
return user.validate();
} catch (Exception ex) {
return false;
}}); .collect(Collectors.toLis
t());
@koenighotze
List.ofAll(users)
.filter(user -> {
try {
return user.validate();
} catch (Exception ex) {
return false;
}}); .collect(Collectors.toLis
t());
@koenighotze
List.ofAll(users)
.filter(user ->
Try.of(user::validate)
.getOrElse(false)
); } catch (IllegalStateException
ex) { return
); .collect(Collectors.toList();
@koenighotze
List.ofAll(users)
List.filter(user ->
Try.of(user::validate)
.getOrElse(false));
@koenighotze
Immutable collections
@koenighotze
Mutable collections
are evil
@koenighotze
Returning void == side-effect!
interface Collection<E> {
…
void clear();
}
interface Collection<E> {
…
void clear();
}
@koenighotze
Collections
.unmodifiableList(list);
.add(“💥”)
@koenighotze
Collections
.unmodifiableList(list)
.add(“💥”);
@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)
@koenighotze
https://cdn.infoq.com/statics_s2_20170314-0434/resource/news/2016/11/the-road-to-javaslang-3/en/resources/1infoq-version2.0-library.png
@koenighotze
Functional data structures
Effectively immutable
heroes = List.of("Han", "Luke")
Cons@661 “Han” T
Cons@666 “Luke” ()
heroes
Cons@661 “Han” T
Cons@666 “Luke” ()
heroes
Cons@662 “Ben” Tmore
more = heroes.prepend("Ben")
droids =
TreeSet.of(
"C3PO",
"R2D2",
"K2SO"
)
Node@676
Node@679 Node@681“K2SO”
() ()“C3PO”
() ()“R2D2”
droids.add("Chopper");
Node@689
Node@691
() Node@694
() ()“Chopper”
Node@676
Node@679 Node@681“K2SO”
() ()“C3PO”
() ()“R2D2”
Checking for updates?
old == new
@koenighotze
Streams are glorified
iterators
@koenighotze
Stream<String> jdk
= Stream.of("a", “B");
jdk.map(String::toUpperCase);
jdk.map(String::toLowerCase);
@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)
@koenighotze
Vavr streams
Stream<String> vavr =
Stream.of("a", "B");
slang.map(String::toUpperCase);
// “A”,“B”
slang.map(String::toLowerCase);
// “a”,“b”
@koenighotze
Stream<String> vavr =
Stream.of("a", "B");
vavr.map(String::toUpperCase)
.take(2);
vavr.map(String::toLowerCase)
.take(2);
@koenighotze
Stream<String> vavr =
Stream.of("a", "B");
vavr.map(String::toUpperCase)
.take(2);// “A”,“B”
vavr.map(String::toLowerCase)
.take(2);// “a”,“b”
@koenighotze
Better performance
Fewer surprises
@koenighotze
Bonus shout-out to @pivovarit:
https://git.io/fj4Od
@koenighotze
Functional sugar
@koenighotze
Find a user and,
if an address is
available, fetch the
user’s street
@koenighotze
User user = repo.findOne("id");
if (user != null) {
Address address = user.getAddress();
if (address != null) {
return address.getStreet();
}
}
@koenighotze
Cascading
Pile of Shame
@koenighotze
java.util.Optional
@koenighotze
Optional<User> opt =
Optional.ofNullable(user);
if (opt.isPresent()) {
User user = opt.get();
}
And now, young coder...
you will die.
@koenighotze
Map or flatMap
there is no
isPresent()
@koenighotze
Optional or Option
@koenighotze
Optional
@koenighotze
Option
Some None
@koenighotze
Option
Some None
Value
Iterable
@koenighotze
Option
Some None
Value
Iterable
@koenighotze
Option
Some None
Value
Iterable
Serializable
@koenighotze
Option is a gift box
@koenighotze
NoneSome
@koenighotze
Map opens the gift box
@koenighotze
Map
Some Some
( )->
@koenighotze
Nothing from nothing
@koenighotze
( )->
Map
None None
@koenighotze
Fixing the
Pile of Shame
@koenighotze
User user = repo.findOne("id");
if (user != null) {
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
}
@koenighotze
User user = repo.findOne("id");
if (user != null) {
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
}
@koenighotze
Option<User> user = repo.findOne("id");
if (user != null) {
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
}
@koenighotze
Option<User> user = repo.findOne("id");
if (user != null) {
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
}
@koenighotze
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()
@koenighotze
Option<User> user = repo.findOne("id");
user.flatMap(User::getAddress)
Address address = user.getAddress();
if (null != address) {
return address.getStreet();
}
}
@koenighotze
Option<User> user = repo.findOne("id");
user.flatMap(User::getAddress)
Address address = user.getAddress();
.map(Address::getStreet)
return address.getStreet();
}
}
repo.findOne("id")
.flatMap(User::getAddress)
.map(Address::getStreet)
.getOrElse("");
@koenighotze
option.of(value)
.map(nested code)
== understandable story
@koenighotze
Functional error handling
@koenighotze
Validation like back in
the days
@koenighotze
public static String check(String iban){
if (validationMagic(iban)) {
return iban;
}
throw new IllegalArgumentException(“Peng”);
}
@koenighotze
Awesome WTF Code
@koenighotze
String iban;
try {
iban = check(“AL47…”);
}
catch (IllegalArgumentException ex) {
iban = "";
}
@koenighotze
All possible
strings
@koenighotze
Strings that are
valid IBANs
@koenighotze
Strings that are
valid IBANs
public static String check(String iban){
if (validationMagic(iban)) {
return iban;
}
throw new IllegalArgumentException(“Peng”);
}
Partial
function
@koenighotze
Lifting exceptions to
options
@koenighotze
Partial
function
Strings that are
valid IBANs
public static String check(String iban){
if (validationMagic(iban)) {
return iban;
}
throw new IllegalArgumentException(“Peng”);
}
@koenighotze
Strings that are
valid IBANs
Total
function
lift()
All possible
strings
public static String check(String iban){
if (validationMagic(iban)) {
return iban;
}
throw new IllegalArgumentException(“Peng”);
}
Partial
function
@koenighotze
String iban = lift(Iban::check)
.apply("AL47...")
.getOrElse("");
@koenighotze
String iban = lift(Iban::check)
.apply("AL47...")
.getOrElse("");
@koenighotze
Wrapping exceptions
with Try
@koenighotze
Try.of(() -> stuffToDo())
@koenighotze
Failure
Exception
Success
Result
Try.of(() -> stuffToDo())
@koenighotze
Try.of(() -> check("AL.."))
.getOrElse("")
@koenighotze
Try.of(() -> check("AL.."))
.getOrElse("")
@koenighotze
try {
ByteArrayOutputStream logo = readLogo(url);
return fetchSuccessful(logo);
} catch (InterruptedException |
TimeoutException e) {
return timedoutResponse();
} catch (ExecutionException e) {
return fetchFailed();
}
@koenighotze
try {
ByteArrayOutputStream logo = readLogo(url);
return fetchSuccessful(logo);
} catch (InterruptedException |
TimeoutException e) {
return timedoutResponse();
} catch (ExecutionException e) {
return fetchFailed();
}
@koenighotze
try {
ByteArrayOutputStream logo = readLogo(url);
return fetchSuccessful(logo);
} catch (InterruptedException |
TimeoutException e) {
return timedoutResponse();
} catch (ExecutionException e) {
return fetchFailed();
}
@koenighotze
try {
ByteArrayOutputStream logo = readLogo(url);
return fetchSuccessful(logo);
} catch (InterruptedException |
TimeoutException e) {
return timedoutResponse();
} catch (ExecutionException e) {
return fetchFailed();
}
@koenighotze
readLogoFromTeamWithTimeout(url)
.map(Controller::fetchSuccessful)
.recover(ExecutionException.class, fetchFailed())
.getOrElse(Controller::timedoutResponse())
@koenighotze
readLogoFromTeamWithTimeout(url)
.map(Controller::fetchSuccessful)
.recover(ExecutionException.class, fetchFailed())
.getOrElse(Controller::timedoutResponse())
@koenighotze
readLogoFromTeamWithTimeout(url)
.map(Controller::fetchSuccessful)
.recover(ExecutionException.class, fetchFailed())
.getOrElse(Controller::timedoutResponse())
@koenighotze
readLogoFromTeamWithTimeout(url)
.map(Controller::fetchSuccessful)
.recover(ExecutionException.class, fetchFailed())
.getOrElse(Controller::timedoutResponse())
@koenighotze
readLogoFromTeamWithTimeout(url)
.map(Controller::fetchSuccessful)
.recover(ExecutionException.class, fetchFailed())
.getOrElse(Controller::timedoutResponse())
@koenighotze
Lifting and Try-ing
reduce exception
handling clutter and
side-effects
@koenighotze
“It’s just like the Schrodinger’s cat story,
you keep working with the box and delay
opening it up until it’s completely necessary
to know what’s happening in there.”
— Maurício Linhares
@koenighotze
Structural decomposition
@koenighotze
Structural decomposition
discouraged!
http://cr.openjdk.java.net/
~briangoetz/amber/pattern-
match.html
@koenighotze
Property based testing
@koenighotze
The idea
@koenighotze
Declarative, infinite test cases
Have you tested for all characters…
…even for 💩?
Have you tested usernames like…
౧ప唆⏑쀋䯰㨼ᮁ娤즶?搃蘸阁뺬ᡧ㫈葷㖒‫ܪ‬匘ᤫ䳴㻅
댇껓痯믶㙃銐璚풔랾ᄰ 䩰삀싲闆䩟嗀嗀侀
@koenighotze
Enter
vavr-property-test
@koenighotze
Property.def(“Something works”)
.forAll(Generated Data)
.suchThat(Checked Function)
.check()
.assertIsSatisfied();
@koenighotze
Arbitrary<String> arbitraryUnicodeId() {
Gen<Character> id = r -> (char) r.nextInt();
return Arbitrary.string(id);
}
@koenighotze
Arbitrary<String> arbitraryUnicodeId() {
Gen<Character> id = r -> (char) r.nextInt();
return Arbitrary.string(id);
}
@koenighotze
Property
.def("Should not go boom”)
.forAll(arbitraryUnicodeString())
.suchThat(id -> isOkOrNotFound(id))
.check()
.assertIsSatisfied();
@koenighotze
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.
@koenighotze
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))
@koenighotze
Functional resilience
@koenighotze
Circuit breaker
one-o-one
@koenighotze
Consumer Backend
@koenighotze
Fallback
Resilience decorator
Closed
Open
Half-Open
Consumer Backend
@koenighotze
Resilience decorator
Closed
Open
Half-Open
Consumer
Fallback
@koenighotze
Fallback
Resilience decorator
Closed
Open
Half-Open
Consumer
@koenighotze
Fallback
Resilience decorator
Closed
Open
Half-Open
Consumer
@koenighotze
Resilience 4 J
@koenighotze
BackendConsumer
Backend
Service
Resilience decorator
Circuit Breaker
Retry
Cache
@koenighotze
Option<…> fetchBoard(String id) {
result = restTemplate.getForEntity(…);
return Match(result.getStatusCode())
.option(…);
}
@koenighotze
Option<…> fetchBoard(String id) {
result = restTemplate.getForEntity(…);
return Match(result.getStatusCode())
.option(…);
}
@koenighotze
CircuitBreaker
.decorateCheckedFunction(
circuitBreaker,
db::fetchBoard);
@koenighotze
Try.of(() -> decorated.apply(stationId))
.getOrElse(empty())
@koenighotze
The last monad?
@koenighotze
http://www.vavr.io/
@koenighotze
Spring data integration
@koenighotze
interface UserRepository extends MongoRepository<User, String> {
Option<User> findByPublicId(String publicId);
Seq<User> findByLastname(String lastname);
}
@koenighotze
interface UserRepository extends MongoRepository<User, String> {
Option<User> findByPublicId(String publicId);
Seq<User> findByLastname(String lastname);
}
@koenighotze
So, is this is the mother of
all free lunches?
@koenighotze
What are the
drawbacks?
@koenighotze
@koenighotze
count(Collection-libs)
>
count(Logging-libs)
@koenighotze
Option.of(foo)
.map
.filter
.flatMap
.map
.flatMap
.getOrElse(null)
N
O
T
a
drawback!
@koenighotze
Version 1.0?
@koenighotze
Modularization
Alignment with Java 9
Obsolete pattern match
(maybe)
http://blog.vavr.io/fast-forward-to-vavr-1-0/
@koenighotze
Wrapping up
@koenighotze
Slick, stable, non-invasive, consistent API
Object-functional advantages now
Complex(?)
Property test(?)
Pattern match(?)
@koenighotze
RESISTTHE TYRANNY OF THE
COLLECTIONS FRAMEWORK
JOIN THE RESISTANCE!
@koenighotze
Thank you!
https://git.io/fj855
All Star Wars related images are copyright Disney Corp.

Weitere ähnliche Inhalte

Was ist angesagt?

groovy rules
groovy rulesgroovy rules
groovy rules
Paul King
 
XSpect, a lightweight library to make your code reusable and maintainable.
XSpect, a lightweight library to make your code reusable and maintainable.XSpect, a lightweight library to make your code reusable and maintainable.
XSpect, a lightweight library to make your code reusable and maintainable.
岡諭 李
 
Java Puzzle
Java PuzzleJava Puzzle
Java Puzzle
SFilipp
 

Was ist angesagt? (20)

#살아있다 #자프링외길12년차 #코프링2개월생존기
#살아있다 #자프링외길12년차 #코프링2개월생존기#살아있다 #자프링외길12년차 #코프링2개월생존기
#살아있다 #자프링외길12년차 #코프링2개월생존기
 
groovy rules
groovy rulesgroovy rules
groovy rules
 
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTRT3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
 
Hadoop Puzzlers
Hadoop PuzzlersHadoop Puzzlers
Hadoop Puzzlers
 
HDTR images with Photoshop Javascript Scripting
HDTR images with Photoshop Javascript ScriptingHDTR images with Photoshop Javascript Scripting
HDTR images with Photoshop Javascript Scripting
 
Dagger & rxjava & retrofit
Dagger & rxjava & retrofitDagger & rxjava & retrofit
Dagger & rxjava & retrofit
 
JVM Mechanics
JVM MechanicsJVM Mechanics
JVM Mechanics
 
Java Performance Puzzlers
Java Performance PuzzlersJava Performance Puzzlers
Java Performance Puzzlers
 
XSpect, a lightweight library to make your code reusable and maintainable.
XSpect, a lightweight library to make your code reusable and maintainable.XSpect, a lightweight library to make your code reusable and maintainable.
XSpect, a lightweight library to make your code reusable and maintainable.
 
TDC2016SP - Trilha .NET
TDC2016SP - Trilha .NETTDC2016SP - Trilha .NET
TDC2016SP - Trilha .NET
 
Kotlin Data Model
Kotlin Data ModelKotlin Data Model
Kotlin Data Model
 
servlets
servletsservlets
servlets
 
Java Puzzle
Java PuzzleJava Puzzle
Java Puzzle
 
greenDAO
greenDAOgreenDAO
greenDAO
 
The Ring programming language version 1.2 book - Part 79 of 84
The Ring programming language version 1.2 book - Part 79 of 84The Ring programming language version 1.2 book - Part 79 of 84
The Ring programming language version 1.2 book - Part 79 of 84
 
Greach, GroovyFx Workshop
Greach, GroovyFx WorkshopGreach, GroovyFx Workshop
Greach, GroovyFx Workshop
 
Getting started with Elasticsearch and .NET
Getting started with Elasticsearch and .NETGetting started with Elasticsearch and .NET
Getting started with Elasticsearch and .NET
 
Realm or: How I learned to stop worrying and love my app database
Realm or: How I learned to stop worrying and love my app databaseRealm or: How I learned to stop worrying and love my app database
Realm or: How I learned to stop worrying and love my app database
 
Scala to assembly
Scala to assemblyScala to assembly
Scala to assembly
 
The Testing Games: Mocking, yay!
The Testing Games: Mocking, yay!The Testing Games: Mocking, yay!
The Testing Games: Mocking, yay!
 

Ähnlich wie Vavr Java User Group Rheinland

CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on Android
Sven Haiges
 
Look Ma, “update DB to HTML5 using C++”, no hands! 
Look Ma, “update DB to HTML5 using C++”, no hands! Look Ma, “update DB to HTML5 using C++”, no hands! 
Look Ma, “update DB to HTML5 using C++”, no hands! 
aleks-f
 
Is your C# optimized
Is your C# optimizedIs your C# optimized
Is your C# optimized
Woody Pewitt
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
Dmitry Buzdin
 

Ähnlich wie Vavr Java User Group Rheinland (20)

Java and xml
Java and xmlJava and xml
Java and xml
 
CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on Android
 
Leap Ahead with Redis 6.2
Leap Ahead with Redis 6.2Leap Ahead with Redis 6.2
Leap Ahead with Redis 6.2
 
Look Ma, “update DB to HTML5 using C++”, no hands! 
Look Ma, “update DB to HTML5 using C++”, no hands! Look Ma, “update DB to HTML5 using C++”, no hands! 
Look Ma, “update DB to HTML5 using C++”, no hands! 
 
Andriy Slobodyanyk "How to Use Hibernate: Key Problems and Solutions"
Andriy Slobodyanyk "How to Use Hibernate: Key Problems and Solutions"Andriy Slobodyanyk "How to Use Hibernate: Key Problems and Solutions"
Andriy Slobodyanyk "How to Use Hibernate: Key Problems and Solutions"
 
Paintfree Object-Document Mapping for MongoDB by Philipp Krenn
Paintfree Object-Document Mapping for MongoDB by Philipp KrennPaintfree Object-Document Mapping for MongoDB by Philipp Krenn
Paintfree Object-Document Mapping for MongoDB by Philipp Krenn
 
PostgreSQL Open SV 2018
PostgreSQL Open SV 2018PostgreSQL Open SV 2018
PostgreSQL Open SV 2018
 
Testing in android
Testing in androidTesting in android
Testing in android
 
Lo Mejor Del Pdc2008 El Futrode C#
Lo Mejor Del Pdc2008 El Futrode C#Lo Mejor Del Pdc2008 El Futrode C#
Lo Mejor Del Pdc2008 El Futrode C#
 
ES6 is Nigh
ES6 is NighES6 is Nigh
ES6 is Nigh
 
Reactive programming on Android
Reactive programming on AndroidReactive programming on Android
Reactive programming on Android
 
Javaslang Talk @ Javaland 2017
Javaslang Talk @ Javaland 2017Javaslang Talk @ Javaland 2017
Javaslang Talk @ Javaland 2017
 
JavaTalks: OOD principles
JavaTalks: OOD principlesJavaTalks: OOD principles
JavaTalks: OOD principles
 
Data access 2.0? Please welcome: Spring Data!
Data access 2.0? Please welcome: Spring Data!Data access 2.0? Please welcome: Spring Data!
Data access 2.0? Please welcome: Spring Data!
 
Annotation processing and code gen
Annotation processing and code genAnnotation processing and code gen
Annotation processing and code gen
 
Cleaning your architecture with android architecture components
Cleaning your architecture with android architecture componentsCleaning your architecture with android architecture components
Cleaning your architecture with android architecture components
 
Is your C# optimized
Is your C# optimizedIs your C# optimized
Is your C# optimized
 
An introduction into Spring Data
An introduction into Spring DataAn introduction into Spring Data
An introduction into Spring Data
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
 
Clean coding-practices
Clean coding-practicesClean coding-practices
Clean coding-practices
 

Mehr von David Schmitz

Mehr von David Schmitz (16)

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)
 
10 Tips for failing at microservices
10 Tips for failing at microservices10 Tips for failing at microservices
10 Tips for failing at microservices
 
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
 
Javaslang @ Devoxx
Javaslang @ DevoxxJavaslang @ Devoxx
Javaslang @ Devoxx
 
Javaslang - Functional Sugar For Java
Javaslang - Functional Sugar For JavaJavaslang - Functional Sugar For Java
Javaslang - Functional Sugar For Java
 
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

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ssuser89054b
 
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak HamilCara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Kandungan 087776558899
 

Kürzlich hochgeladen (20)

data_management_and _data_science_cheat_sheet.pdf
data_management_and _data_science_cheat_sheet.pdfdata_management_and _data_science_cheat_sheet.pdf
data_management_and _data_science_cheat_sheet.pdf
 
Online electricity billing project report..pdf
Online electricity billing project report..pdfOnline electricity billing project report..pdf
Online electricity billing project report..pdf
 
A CASE STUDY ON CERAMIC INDUSTRY OF BANGLADESH.pptx
A CASE STUDY ON CERAMIC INDUSTRY OF BANGLADESH.pptxA CASE STUDY ON CERAMIC INDUSTRY OF BANGLADESH.pptx
A CASE STUDY ON CERAMIC INDUSTRY OF BANGLADESH.pptx
 
S1S2 B.Arch MGU - HOA1&2 Module 3 -Temple Architecture of Kerala.pptx
S1S2 B.Arch MGU - HOA1&2 Module 3 -Temple Architecture of Kerala.pptxS1S2 B.Arch MGU - HOA1&2 Module 3 -Temple Architecture of Kerala.pptx
S1S2 B.Arch MGU - HOA1&2 Module 3 -Temple Architecture of Kerala.pptx
 
Navigating Complexity: The Role of Trusted Partners and VIAS3D in Dassault Sy...
Navigating Complexity: The Role of Trusted Partners and VIAS3D in Dassault Sy...Navigating Complexity: The Role of Trusted Partners and VIAS3D in Dassault Sy...
Navigating Complexity: The Role of Trusted Partners and VIAS3D in Dassault Sy...
 
Tamil Call Girls Bhayandar WhatsApp +91-9930687706, Best Service
Tamil Call Girls Bhayandar WhatsApp +91-9930687706, Best ServiceTamil Call Girls Bhayandar WhatsApp +91-9930687706, Best Service
Tamil Call Girls Bhayandar WhatsApp +91-9930687706, Best Service
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 
Thermal Engineering Unit - I & II . ppt
Thermal Engineering  Unit - I & II . pptThermal Engineering  Unit - I & II . ppt
Thermal Engineering Unit - I & II . ppt
 
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...
 
Hostel management system project report..pdf
Hostel management system project report..pdfHostel management system project report..pdf
Hostel management system project report..pdf
 
Learn the concepts of Thermodynamics on Magic Marks
Learn the concepts of Thermodynamics on Magic MarksLearn the concepts of Thermodynamics on Magic Marks
Learn the concepts of Thermodynamics on Magic Marks
 
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
 
Bhubaneswar🌹Call Girls Bhubaneswar ❤Komal 9777949614 💟 Full Trusted CALL GIRL...
Bhubaneswar🌹Call Girls Bhubaneswar ❤Komal 9777949614 💟 Full Trusted CALL GIRL...Bhubaneswar🌹Call Girls Bhubaneswar ❤Komal 9777949614 💟 Full Trusted CALL GIRL...
Bhubaneswar🌹Call Girls Bhubaneswar ❤Komal 9777949614 💟 Full Trusted CALL GIRL...
 
School management system project Report.pdf
School management system project Report.pdfSchool management system project Report.pdf
School management system project Report.pdf
 
HOA1&2 - Module 3 - PREHISTORCI ARCHITECTURE OF KERALA.pptx
HOA1&2 - Module 3 - PREHISTORCI ARCHITECTURE OF KERALA.pptxHOA1&2 - Module 3 - PREHISTORCI ARCHITECTURE OF KERALA.pptx
HOA1&2 - Module 3 - PREHISTORCI ARCHITECTURE OF KERALA.pptx
 
Rums floating Omkareshwar FSPV IM_16112021.pdf
Rums floating Omkareshwar FSPV IM_16112021.pdfRums floating Omkareshwar FSPV IM_16112021.pdf
Rums floating Omkareshwar FSPV IM_16112021.pdf
 
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak HamilCara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
 
Online food ordering system project report.pdf
Online food ordering system project report.pdfOnline food ordering system project report.pdf
Online food ordering system project report.pdf
 
Air Compressor reciprocating single stage
Air Compressor reciprocating single stageAir Compressor reciprocating single stage
Air Compressor reciprocating single stage
 
Double Revolving field theory-how the rotor develops torque
Double Revolving field theory-how the rotor develops torqueDouble Revolving field theory-how the rotor develops torque
Double Revolving field theory-how the rotor develops torque
 

Vavr Java User Group Rheinland