Created by Bartek Kuczyński / @koziolek
Język
API
Język
API
Sposób pisania kodu
Java Date and Time
JavaFX
Samodzielna implementacja
Dużo samodzielnej zabawy
PoC dla biznesu
Zmiana składni - lambdy, referencje
Dobre i złe praktyki
Stream<Invoice> invoiceStream = service.updateInvoices(id,
                    new Function<Invoice, Invoice>() {
	@Override
	public Invoice apply(Invoice i) {
		i.setTotal(i.getTotal() + 1);
		return i;
	}
});
                
Stream<Invoice> invoiceStream = service.updateInvoices(id,
                    i-> {
		                i.setTotal(i.getTotal() + 1);
		                return i;
                    }
});
                Java to nie Scala
Java nie jest Funkcyjna
Brakuje pewnych podstaw
Zmiana składni - lambdy, referencje
Słaba znajomość całości API
Jest lepsze - naprawiono błędy
Nowe wygodniejsze elementy
Mniej baroku
Wymusił zmianę myślenia
Zainteresowanie FP
Nowe narzędzia → nowe możliwości
Wszystkie przykłady pochodzą z kodu który w jakiś sposób popełniłem
Można się śmiać
Stream<Invoice> invoiceStream = service.updateInvoices(id,
                    i-> {
		                i.setTotal(i.getTotal() + 1);
		                return i;
                    }
});
                
Stream<Invoice> invoiceStream = service.updateInvoices(id,
    i -> new Invoice(i.getId(), i.getCustomer(), i.getTotal() + 1)
);
                
@Transactional
public Stream<Invoice> updateInvoices(Long id,
                    Function<Invoice, Invoice> updater) {
	return Optional.ofNullable(dao.findOne(id))
			.map(Customer::getInvoices)
			.orElseGet(Collections::emptyList)
			.stream()
			.map(updater
                    .andThen(invoiceDao::saveAndFlush)
            );
}
                
Optional<Invoice> one = Optional.ofNullable(dao.findOne(id));
if(one.isPresent()){
	// pewna logika
}
return one;
                
Optional<Invoice> one = Optional.ofNullable(dao.findOne(id));
one.ifPresent(i-> /*pewna logika*/);
return one;
                
invoices.stream()
		.filter(notNull)
		.filter(notOlderThan)
		.filter(lessThan)
		.map(asB2bInvoice)
		.map(fvM)
		.reduce(summary);
                
invoices.stream()
		.filter(notNull.and(notOlderThan).and(lessThan))
		.map(asB2bInvoice.andThen(fvM))
		.reduce(summary);
                
for(Invoice i : invoices){
    // 300 linii kodu
}
                
invoices.foreach(i-> {
    // 300 linii kodu
});
                
invoices.stream()
		.map(i -> {
			someOtherService.call(i.getCustomer());
			i.getItems().stream()
					.map(it->{
				}).reduce(partialItemSummary);
		})
		.reduce(itemSummary);
                
invoices.stream(
		.peek(i -> someOtherService.call(i.getCustomer())
		.flatMap(i -> i.getItems().stream())
		.reduce(itemSummary)
                Javaslang
Reactive
Testowanie
Myślenie FP