Filtrování v Java 8

Java 8 představila streamy a ty mají metodu filter, která má jako parametr predikát (funkce vracejítí pravdu nebo nepravdu). V následujícím příkladu se z původního seznamu vytvoří nový seznam, který bude obsahovat pouze objekty se statusem OPEN.

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class App {

	public static void main(String[] args) {
		List<MyObject> list = Arrays.asList(
				new MyObject(Status.CLOSED.getId(), "AAA"),
				new MyObject(Status.OPEN.getId(), "BBB"),
				new MyObject(Status.OPEN.getId(), "CCC"),
				new MyObject(Status.CLOSED.getId(), "DDD"),
				new MyObject(Status.OPEN.getId(), "EEE")
		);

		List<MyObject> open = list.stream()
			.filter(myObject -> myObject.getStatus() == Status.OPEN.id)
			.collect(Collectors.toList());

		open.forEach(openObject -> System.out.println(openObject.getName()));
	}

	private enum Status {
		OPEN(1L), CLOSED(2L);

		private long id;

		private Status(long id) {
			this.id = id;
		}

		public long getId() {
			return id;
		}
	}
}
 class MyObject {

	private long status;
	private String name;

	public MyObject(long status, String name) {
		this.status = status;
		this.name = name;
	}

	public long getStatus() {
		return status;
	}

	public void setStatus(long status) {
		this.status = status;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

Výsledek:

BBB
CCC
EEE

Vaadin a Spring Boot – vytvoření projektu

Když vytvořím projekt z STS jako Spring Starter Project, po spuštění se mi ukáže v prohlížeči tento text:

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Sun Dec 17 12:53:44 CET 2017
There was an unexpected error (type=Not Found, status=404).
No message available

Totéž se stane, pokud si nechám identický projekt vytvořit přes http://start.spring.io/. Je třeba si v projektu vytvořit UI.

import com.vaadin.server.VaadinRequest;
import com.vaadin.spring.annotation.SpringUI;
import com.vaadin.ui.Label;
import com.vaadin.ui.UI;

@SpringUI
public class VaadinUI extends UI {

	@Override
	protected void init(VaadinRequest request) {
		setContent(new Label("Hello World"));
	}

}

Nyní po spuštění (Run As -> Spring Boot App) dostanu tuto stránku:

vaadin-spring-boot-vytvoreni-projektu

Začínáme programovat v Go: 7. díl – funkce

V dneším díle tutoriálu se podíváme na funkce. Funkce je blok příkazů, které mají se mají provést po zavolání. Funkce se vytváří pomocí klíčového slova func. Už jsme se setkali s funkcí main, kterou musí mít program, pokud se má spustil a také s funkcí Println z balíčku fmt, která do konzole zobrazí předané hodnoty (argumenty). V této části tutoriálu se naučíme vytvářet si funkce vlastní.

func sayHello() {
	fmt.Println("Ahoj")
}

Tato funkce zobrazí do konzole text „Ahoj“.

func sayName(name string) {
	fmt.Println("Jmenuji se", name)
}

Tato funkce zobrazí text „Jmenuji se“ a zároveň text, který dostane jako argument. Dalo by se to zapsat též jako fmt.Println(„Jmenuji se “ + name)

func getBy() string {
	return "Měj se"
}

Tato funkce vrátí hodnotu (textový retězec). Pokud chceme, aby funkce něco vrátila, použijeme klíčové slovo return. Zde říkám vrať string „Měj se“. Zároveň musíme určit, jaký datový typ má funkce vracet. Typ návratové hodnoty se zadává za kulaté závorky (func getBy() string { … }).

A zde je celý kód.

package main

import (
	"fmt"
)

func main() {
	sayHello()
	sayName("John")
	fmt.Println(getBy())
}

func sayHello() {
	fmt.Println("Ahoj")
}

func sayName(name string) {
	fmt.Println("Jmenuji se", name)
}

func getBy() string {
	return "Měj se"
}

Ještě upozorním na příkaz fmt.Println(getBy()). Nejdříve se zavolá funkce getBy(), která vrátí string „Měj se“. Tento string se předá do funkce Println, která jej vytiskne. Je to totéž, jako bycho provedli toto:

var by string = getBy()
fmt.Println(by)

Úkol
Vytvořte program se čtyřmi funkcemi. Každá funkce bude mít dva parametry (dvě celá čísla) a bude vracet výsledek. Funkce budou pro sčítán, odčítání, násobení a dělení. Výsledky zobrazte pomocí funkce Println. Opět upozorňuji na to, že pokud počítáte s celými čísly, tak výsledek operace dělení, který vrací desetinné číslo, bude pouze celočíselná část (3 : 2 = 1,5 celočíselná část je 1, takže výsledek bude 1 a ne 1,5)

Možné řešení

package main

import (
	"fmt"
)

func main() {
	var x int = 6
	var y int = 2

	/* Hodnotu vrácenou funkcí můžeme uložit do proměnné a tu potom zobrazit */
	var addResult = add(x, y)
	fmt.Println(addResult)

	/* Nebo můžeme rovnou zobrazit hodnotu bez mezikroku s přiřazením proměnné. */
	fmt.Println(substract(x, y))
	fmt.Println(multiply(x, y))
	fmt.Println(divide(x, y))
}

func add(x int, y int) int {
	return x + y
}

func substract(x int, y int) int {
	return x - y
}

func multiply(x int, y int) int {
	return x * y
}

func divide(x int, y int) int {
	return x / y
}

Vaadin a TextChangeListener

TextChangeListener je listener pro TextChangeEvent, která vznikne, když uživatel edituje textový obsah pole (nejčastěji psaním textu z klávesnice či vložení textu do textového pole). V následujícím příkladu vytvoříme dvě textová pole a prvnímu dáme TextChangeListener s tím, že hodnota vepsaná do prvního textového pole se změní na velká písmena a zobrazí v druhém textovém poli.

final VerticalLayout layout = new VerticalLayout();
layout.setMargin(true);
setContent(layout);

TextField tf1 = new TextField("First");
TextField tf2 = new TextField("Second");

tf1.addTextChangeListener(new TextChangeListener() {
	@Override
	public void textChange(TextChangeEvent event) {
		tf2.setValue(event.getText().toUpperCase());
	}
});

layout.addComponents(tf1, tf2);

V Javě 8 je možný tento zápis:

final VerticalLayout layout = new VerticalLayout();
layout.setMargin(true);
setContent(layout);

TextField tf1 = new TextField("First");
TextField tf2 = new TextField("Second");

tf1.addTextChangeListener(event -> {
	tf2.setValue(getValue(event.getText().toUpperCase()));
});

layout.addComponents(tf1, tf2);

Výsledek

Vaadin_a_TextChangeListener

Protocol Buffers

Protocol Buffres (protobuffers) je způsob serializace dat. Serializací je myšleno „převedení datové struktury nebo instance objektu uložené ve vnitřní paměti počítače na posloupnost bitů, kterou lze uložit na nějaké úložiště, případně přenést po síti … je třeba počítat s tím, že objekt budeme převádět zpět ze serializované do původní podoby pomocí tzv. deserializace“ (wiki: wiki).

Protocol Buffers je formát vyvinutý společností Google a je určen pro efektivní výměnu dat. Slovíčko efektivní je zde velmi důležité. Obvyklými formáty dat, pro výměnu, jsou XML a Json. Protofuffer je navržen tak, aby se dal rychle serializovat a deserializovat a byl co nejméně datově náročný. Dle stránky developers.google.com/…/overview je oproti XML:

  • jednodušší
  • 3 – 10 krát menší
  • 20 – 100 krát rychlejší
  • více jednoznačný
  • generuje datové třídy, které se jednodušeji používají.

Konkurentem protobuffers je Apačí projekt Thrift.

Protocol Buffers potřebují schéma, což je textový soubor s příponou .proto. Zde je příklad, jak takový .proto soubor může vypadat:

syntax = "proto3";

option java_package = "cz.vitfo.protobuff";
option java_outer_classname = "PbUser";

message User {
	string username = 1;
	UserProfile userProfile = 2;
}

message UserProfile {
	enum UserStatus {
		ACTIVE = 0;
		PASSIVE = 1;
		CLOSED = 2;
	}
	
	string password = 1;
	UserStatus userStatus = 2;
}

Příště si ukážeme, jak takový soubor vytvořit, zkompilovat a vysvětlíme si, co jednotlivé části znamenají.