mongodb and java 8 - goto bloggotocon.com/dl/goto-amsterdam-2015/slides/emilforslund_and... · 6...

72

Upload: dinhdung

Post on 16-Apr-2018

274 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream
Page 2: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

MongoDB and Java 8

Page 3: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

3

Agenda

Java8 Main Features MongoDB + Java8 Few Examples RX Driver

Page 4: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

Java 8

Page 5: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

MongoDB Java Driver is JAVA6+ Complaint

Page 6: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

6

Java 8 Features and Improvements •  Lambda Expressions •  New Date API •  Stream API •  Type Annotations •  Compact Profiles •  Security Enhancements •  JavaFX Improvements •  Nashorn JS Engine •  Unicode Enhancements •  Selector Provider (IO & NIO) •  Concurrency •  …

http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html

Page 7: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

7

Java 8 Features and Improvements •  Lambda Expressions •  Stream API •  New Date API •  Type Annotations •  Compact Profiles •  Security Enhancements •  JavaFX Improvements •  Nashorn JS Engine •  Unicode Enhancements •  Selector Provider (IO & NIO) •  Concurrency •  …

http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html

Page 8: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

8

Lambda Function •  Anonymous Functions

–  Not bounded to an identifier –  Inline definition –  Passed as argument to higher-order

functions •  Functional Java FTW

Page 9: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

9

Lambda Function

….map(line -> Arrays.asList(line.split(SEPARATOR)))

i -> document.put(headers.get(i), values.get(i) )

•  Anonymous Functions –  Not bounded to an identifier –  Inline definition –  Passed as argument to higher-order

functions •  Functional Java FTW

Page 10: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

10

Stream API •  Streams are free flowing

sequence of elements –  Pipeline kind of processing

•  Starts with a source of data (Collections)

–  Processes elements of that data source in a parallelized fashion

–  Intermediary processing steps

•  Generally implemented by lambdas

–  Terminator operators •  Streams are immutable!

try(BufferedReader reader = new BufferedReader(fr)){return reader.lines().skip(1).map(line -> { Document document = new Document(); List<String> values = Arrays.asList(line.split(SEPARATOR)); IntStream.range(0, Math.min(values.size(), headers.size())) .forEach(i -> document.put(headers.get(i), values.get(i) )); return document;}).collect(Collectors.toList());

Page 11: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

11

Stream API public List<Document> readRecords(List<String> headers) {

try (FileReader fr = new FileReader(this.source);BufferedReader reader = new BufferedReader(fr)) {

return reader.lines().skip(1).map(line -> {

Document document = new Document();List<String> values = Arrays.asList(line

.split(SEPARATOR));IntStream.range(0,

Math.min(values.size(), headers.size())).forEach(

i -> document.put(headers.get(i),values.get(i)));

return document;

}).collect(Collectors.toList());

} catch (IOException e) {throw new UncheckedIOException(e);

}}

Page 12: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

12

New Date API

•  There is no native support for new Date API •  Our Codec API gives the possibility map this data

type ( Instant.class ) to encode to a driver supported data type and decode back to the original data type

InstantCodec instantCodec = new InstantCodec();

Map<BsonType, Class<?>> replacements = new HashMap<BsonType, Class<?>>();

replacements.put(BsonType.DATE_TIME, Instant.class);

Page 13: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

13

New Date API public class InstantCodec implements Codec<Instant> {

public void encode(BsonWriter writer, Instant value,EncoderContext encoderContext) {

//will store Instant has Epoch Milliseconds writer.writeDateTime(value.toEpochMilli());

}

public Class<Instant> getEncoderClass() {return Instant.class;

} //return back on Instant.class

public Instant decode(BsonReader reader, DecoderContext decoderContext) {

return Instant.ofEpochMilli(reader.readDateTime());}

} http://mongodb.github.io/mongo-java-driver/3.0/bson/codecs/

Page 14: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

14

New Date API public class InstantCodec implements Codec<Instant> {

public void encode(BsonWriter writer, Instant value,EncoderContext encoderContext) {

//will store Instant has Epoch Milliseconds writer.writeDateTime(value.toEpochMilli());

}

public Class<Instant> getEncoderClass() {return Instant.class;

} //return back on Instant.class

public Instant decode(BsonReader reader, DecoderContext decoderContext) {

return Instant.ofEpochMilli(reader.readDateTime());}

} http://mongodb.github.io/mongo-java-driver/3.0/bson/codecs/

Page 15: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

15

New Date API InstantCodec instantCodec = new InstantCodec();Map<BsonType, Class<?>> replacements = new HashMap<BsonType, Class<?>>();replacements.put(BsonType.DATE_TIME, Instant.class);

CodecRegistry cr = CodecRegistries.fromRegistries(CodecRegistries.fromCodecs(instantCodec),CodecRegistries.fromProviders(documentCodecProvider),MongoClient.getDefaultCodecRegistry());

// add the new code registry has option.MongoClientOptions option = MongoClientOptions.builder()

.codecRegistry(cr).build();

mc = new MongoClient("localhost:27017", option);collection = mc.getDatabase("dates").getCollection("sample");

Document doc = new Document("java8date", Instant.now());

collection.insertOne(doc);

Page 16: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

Extra: RX Driver

Page 17: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

ReactiveX

Observable

Observer

Page 18: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

18

MongoDB Reactive Streams Driver

•  http://mongodb.github.io/mongo-java-driver-rx/

•  Observer based rather than callback based! (Cold Observables)

•  Built upon the MongoDB Async Driver & RxJava

Page 19: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

Join the Java Courses

Page 20: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

20

https://university.mongodb.com/courses/M101J

Page 21: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

Engineering

Sales & Account Management Finance & People Operations

Pre-Sales Engineering Marketing

Join the Team

View all jobs and apply: http://grnh.se/pj10su

Page 22: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

Obrigado! Norberto Leite Technical Evangelist [email protected] @nleite https://github.com/nleite/java8demo

Page 23: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream
Page 24: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

A SIMPLE GUIDE TOUSING AKKA

PERSISTENCEJoost Heijkoop

Page 25: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

WHAT WILL THIS BE ABOUT?Using Akka with ScalaEvent SourcingHow to add Akka PersistenceHow to do Serialization with Stamina

Page 26: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

WHO AM I?Joost HeijkoopI like to create/build/learn/share/teach stuffI'm a Software developer, Full Stack Developer, Back-endDeveloper, Consultant, ...I Work at XebiaAmsterdam.scala meetup (SUG) organisorSerial meetup / conference attendee

Page 27: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

BUILD STUFF!

Page 28: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

AKKA + SCALAAkka is an Actor Framework, similar to ErlangAkka is message driven, "extreme" OOScala hybrid programming language on the JVM

Page 29: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

AKKA + SCALAclass Parrot extends Actor { var count = 0

override def receive: Receive = { case message: String => { count = count + 1 println(s"$count: $message") } }}

val parrot = system.actorOf(Parrot.props)parrot ! "Hello"parrot ! "Hello"

1: Hello2: Hello

Page 30: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

WHAT IS EVENT SOURCINGAll truths spring from recording eventsThe current state is the sum of all eventsCommand -> Event -> UpdateRecording of delta instead of current stateYou can replay all of historyCQRS (Command Query Responsibility Segregation) - MartinFowler

Page 31: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

EVENT SOURCING WITH AKKAPERSISTENCE

Get a commandCreate eventPersist/record the event to Event StoreUpdate the internal state

Page 32: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

EVENT SOURCING WITH AKKAPERSISTENCE

final def persist[A](event: A)(handler: (A) => Unit): Unit

override def receiveCommand: Receive = { case message: String => persist(Incremented(count + 1, message))(update) println(s"$count: $message")}

def update: Receive = { case Incremented(newCount, message) => count = newCount}

Page 33: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

EVENT SOURCING WITH AKKAPERSISTENCE

class Parrot extends PersistentActor { var count = 0 override def persistenceId = "parrot"

override def receiveRecover: Receive = { case event: Incremented => update(event) }

override def receiveCommand: Receive = { case message: String => persist(Incremented(count + 1, message))(update) println(s"$count: $message") }

def update = { case Incremented(newCount, message) => count = newCount }}

Page 34: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

AKKA + SCALAclass Parrot extends Actor { var count = 0

override def receive: Receive = { case message: String => { count = count + 1 println(s"$count: $message") } }}

Page 35: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

PERSISTED STATEBEFORE

1: Hello2: Hello[restart app]1: Hello

WITH AKKA PERSISTENCE1: Hello2: Hello[restart app]3: Hello

Page 36: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

STANDARD SERIALIZATION IS A PAINJava serialization is standard

Incremented(count: Int)-> IncrementedV2(count: Int, message: String)

What you wantIncremented(count: Int)-> Incremented(count: Int, message: String)

Page 37: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

STAMINAIt serializes to a non-binary formatThe default serialization is JSONAllows you to migrate before deserializationThe is a catch, for now

Page 38: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

ADD STAMINASRC/MAIN/RESOURCES/APPLICATION.CONF

akka.actor { serializers { goto = "goto.PricingAkkaSerializer" } serialization-bindings { "stamina.Persistable" = goto }}

Page 39: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

ADD STAMINAimport stamina._import stamina.json._import stamina.json.SprayJsonMacros._

case class Incremented(count: Int) extends Persistable

val parrotPersister = persister[Incremented]("increment")

class PricingAkkaSerializer(persisters: Persisters) extends StaminaAkkaSerializer(persisters) {

def this() { this(Persisters(List(Parrot.parrotPersister))) }}

Page 40: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

STAMINA MIGRATIONcase class Incremented(count: Int, message: String) extends Persistable

persist(Incremented(count + 1, message))(update)

def update: Receive = { case Incremented(newCount, message) => count = newCount}

Page 41: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

STAMINA MIGRATIONimport spray.json.lenses.JsonLenses._

val parrotPersister = persister[Incremented, V2]( "increment", from[V1].to[V2]( _.update('message ! set[String]("[empty message]"))))

Page 42: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

STAMINAPROJECT/BUILD.SCALA

import sbt.{Build, Project, ProjectRef, uri}

object GotoBuild extends Build { lazy val root = Project("root", sbt.file(".")) .dependsOn(staminaCore, staminaJson)

lazy val staminaCore = ProjectRef( uri("git://github.com/scalapenos/stamina.git#master"), "stamina-core") lazy val staminaJson = ProjectRef( uri("git://github.com/scalapenos/stamina.git#master"), "stamina-json")}

Page 43: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

QUESTIONSUsing Akka with Scala?Event Sourcing?How to add Akka Persistence?How to do Serialization with Stamina?Wat?!?

Page 44: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

RESOURCESAkka Persistence Stamina exampleAkka Persistence documentationStamina - Akka Persistence serializationCQRS - Martin Fowler

Event Sourcing - Martin Fowler

Amsterdam.scala meetup groupXebia

Page 45: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

Design for Quality in Java 8Emil Forslund

Speedment, Inc.

Page 46: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

About meo Emil Forslund

o Code Monkey @ Speedment, Inc.

Page 47: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

About the project Speedment is a java tool that

o generates a domain model from a database,

o organize that model in a graph-like manner, and

o let you write super-fast in-memory database transactions.

Page 48: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

About the project Speedment has been in development for about 5 years and consist of roughly 1800 components.

When Java 8 was released, the entire code base was rewritten to make use of all the new language features.

Page 49: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

Some words about inheritanceo Created as a means of reducing code repetition almost 50 years ago

o Makes it possible to organize code in a well established structure

Page 50: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

And what tends to happen?o As a system grows, dependency trees tend to grow as well

o Often leads to coupled systems with bad maintainability

o Testability worsens with complex inheritance models

Page 51: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

What is a trait?

o A reusable component that can be combined to create classes

o A description of a specific behavior or property

Page 52: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

Trait definition?

o A set of methods that implement behavior

o Stateless

o Can be combined using the following operators:

– Symmetric sum

– Override (asymmetric sum)

– Alias

– Exclusion

Page 53: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

An example in Scala

trait HasName {

def nameProperty() : Property[String]

def setName(name : String) {

nameProperty().set(name)

}

def getName(name : String) : Option[String] =

nameProperty().get(name)

}

Page 54: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

Traits in Java? Was not possible... until recently with the release of Java 8

Page 55: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

Default methods Using interface default methods, a concept similar to Traits can be achieved

Interfaces can

o be combined

o be overridden

o have a default implementation

o be referenced using the ”&” selector

Page 56: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

What is the difference Interfaces doesn't cover all the features of traits from other languages

You still can’t:

o prioritize different traits

o do other operations than union

Page 57: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

So how does it look in Java?

interface HasName {

Property<String> nameProperty();

default void setName(String name) {

nameProperty().setValue(name);

}

default Optional<String> getName() {

return Optional.ofNullable(nameProperty().getValue());

}

}

Page 58: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

So how does it look in Java?

interface HasName {

Property<String> nameProperty();

default void setName(String name) {

nameProperty().setValue(name);

}

default Optional<String> getName() {

return Optional.ofNullable(nameProperty().getValue());

}

}

Page 59: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

So how does it look in Java?

interface HasName {

Property<String> nameProperty();

default void setName(String name) {

nameProperty().setValue(name);

}

default Optional<String> getName() {

return Optional.ofNullable(nameProperty().getValue());

}

}

Page 60: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

So how does it look in Java?

interface HasName {

Property<String> nameProperty();

default void setName(String name) {

nameProperty().setValue(name);

}

default Optional<String> getName() {

return Optional.ofNullable(nameProperty().getValue());

}

}

Page 61: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

Write decoupled systems

class Person implements HasName {...}

class Pet implements HasName {...}

class Friend {

public void show(HasName a, HasName b) {

System.out.println(a.getName().orElse("no one")

+ " is a friend of "

+ b.getName().orElse("no one")

+ "."

);

}

}

Page 62: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

Write decoupled systems

class Person implements HasName {...}

class Pet implements HasName {...}

class Friend {

public void show(HasName a, HasName b) {

System.out.println(a.getName().orElse("no one")

+ " is a friend of "

+ b.getName().orElse("no one")

+ "."

);

}

}

Page 63: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

Write decoupled systems

class Person implements HasName {...}

class Pet implements HasName {...}

class Friend {

public void show(HasName a, HasName b) {

System.out.println(a.getName().orElse("no one")

+ " is a friend of "

+ b.getName().orElse("no one")

+ "."

);

}

}

Page 64: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

Write decoupled systems

class Person implements HasName {...}

class Pet implements HasName {...}

class Friend {

public void show(HasName a, HasName b) {

System.out.println(a.getName().orElse("no one")

+ " is a friend of "

+ b.getName().orElse("no one")

+ "."

);

}

}

Page 65: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

Write decoupled systems

class Person implements HasName {...}

class Pet implements HasName {...}

class Friend {

public void show(HasName a, HasName b) {

System.out.println(a.getName().orElse("no one")

+ " is a friend of "

+ b.getName().orElse("no one")

+ "."

);

}

}

Page 66: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

Combine multiple traits

<T extends HasName & HasFields> String printFields(T obj) {

return obj.getName()

+ " has the following fields: "

+ obj.getFields().collect(joining("\n"))

;

}

Page 67: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

Combine multiple traits

<T extends HasName & HasFields> String printFields(T obj) {

return obj.getName()

+ " has the following fields: "

+ obj.getFields().collect(joining("\n"))

;

}

Page 68: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

Combine multiple traits

<T extends HasName & HasFields> String printFields(T obj) {

return obj.getName()

+ " has the following fields: "

+ obj.getFields().collect(joining("\n"))

;

}

Page 69: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

Combine multiple traits

<T extends HasName & HasFields> String printFields(T obj) {

return obj.getName()

+ " has the following fields: "

+ obj.getFields().collect(joining("\n"))

;

}

Page 70: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

Comparison More components to keep track of

More components to write tests for

Lower average file length

Easier to reuse code when scaling out functionality

Tests are more specific and might reveal more bugs

Page 71: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

Real world exampleRefactoring Speedment took about 6 months

Maintainability measurements improved by 70%

Testability measurements improved by 40%

Complexity was reduced by 90%

Page 72: MongoDB and Java 8 - GOTO Bloggotocon.com/dl/goto-amsterdam-2015/slides/EmilForslund_and... · 6 Java 8 Features and Improvements • Lambda Expressions • New Date API • Stream

Want to know more?

Interwebs: www.speedment.org

Github: www.github.org/speedment

Twitter: @Speedment

@emifors