Java 9 Flow.Subscriber and Flow.Publisher

Java 9 představila Flow API, které umožňuje reaktivní programování. V tomto příspěvku vytvořím aplikaci, která se bude skládat z jednoho publishera, který vytváří data a dvou subscriberů, kteří data zpracovávají. Jeden ze subscriberů je dostatečně rychlý a zvládá data zpracovávat rychleji, než je publisher produkuje, druhý subscriber je výrazně pomalejší.

Číst dálJava 9 Flow.Subscriber and Flow.Publisher

Rozdíl mezi rozhraním a statickou třídou v Javě

Java 8 zavedla defaultní metody v rozhraní, čímž trochu smyla rozdíl mezi rozhraním a abstraktní třídou. V tomto příspěvku se tedy podíváme blíže na rozhraní, jejich defaultní metody, abstraktní třídy a rozdíly mezi rozhraními a abstraktními třídami. Defaultním metodám se věnoval i tento dřívější příspěvek.

Rozhraní:
Může obsahovat statické metody.
Může obsahovat metody, které jsou implementovány (mají tělo).
Pro implementaci rozhraní se používá klíčové slovo implements.
Rozhraní nemůže mít instanční proměnné.
Rozhraní může mít pouze proměnné typu public static final (konstanty).
Metody v rozhraní jsou defaultně public abstract.

Číst dálRozdíl mezi rozhraním a statickou třídou v Javě

Nedaří se nainstalovat default-jdk na Ubuntu

Řešil jsem problém, že na serveru je oracle Java 8 a po zadání apt-get install default-jdk se nic nestalo. Chtěl jsem nainstalovat open jdk 11. Řešením je přidat open jdk do PPA (Personal Package Archiver). Pro instalaci open jdk 11 můžete použít následující příkaz:

sudo add-apt-repository ppa:openjdk-r/ppa \
&& sudo apt-get update -q \
&& sudo apt install -y openjdk-11-jdk

Následně je možné použít příkazy update-java-alternatives --list a update-alternatives --config java pro nastavení výchozí Javy.

Zdroje:

Regulární výrazy v Javě

Pomocí regulárních výrazů definujeme vzory hledání pro řetězce. Vzor může být jediný znak, přesný řetězec, nebo složitý výraz obsahující speciální znaky.

Regulární výraz Popis
. Jakýkoliv znak
* Výskyt 0 nebo vícekrát
+ Výskyt 1 nebo vícekrát
? Výskyt 0 nebo jedenkrát
^ Začátek řádky (^A – začátek řádku musí začínat na A)
$ Konec řádky (z$ – řádek musí končit na z)
[] Definice možných výskytů ([123] – obsahuje 1, 2 nebo 3)
{} Počet možných výskytů ({5,7} – vyskytuje se alespoň 5x a maximálně 7x)
() Seskupení výrazů
| Nebo (a|b – a nebo b)
?! Negace (a?!b – a pokud není následováno b)
(?i) Regulární výraz není citlivý na malá a velká písmena (pozor na písmena s diakritikou)
\d Jakékoliv číslo
\D Cokoliv kromě čísla
\s Jakýkoliv bílý znak
\S Cokoliv kromě bílých znaků
\w Písmeno, číslice nebo podtržítko
\W Cokoliv kromě písmena, číslice nebo podtržítka

Java String má následující metody, které jako parametr mají regulární výraz:

string.matches("regex")
string.split("regex")
string.replaceFirst("regex", "replacement")
string.replaceAll("regex", "replacement")

Pro pokročilejší práci s regulárními výrazy se používají třídy Pattern a Matcher.

final String text = "Nějaký text";
final String regex = "Regulární výraz";
final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(text);
matcher.find()

Instalace Open JDK na Ubuntu

V tomto příspěvku se podíváme na to, jak instalovat Open JDK na Ubuntu. To, zda již nějakou verzi Javy máte nainstalovánu zjistíte příkazem java -version.

java -version
openjdk 11.0.2 2019-01-15
OpenJDK Runtime Environment (build 11.0.2+9-Ubuntu-3ubuntu118.04.3)
OpenJDK 64-Bit Server VM (build 11.0.2+9-Ubuntu-3ubuntu118.04.3, mixed mode, sharing)

To, zda máte více verzí Javy zjistíte příkazem update-alternatives --config java.

update-alternatives --config java
There is only one alternative in link group java (providing /usr/bin/java): /usr/lib/jvm/java-11-openjdk-amd64/bin/java
Nothing to configure.

Jak je vidět z výpisu mám pouze jednu verzi Javy. Defaultní JDK nainstaluje takto:

apt-get install default-jdk
Reading package lists... Done
Building dependency tree
Reading state information... Done
default-jdk is already the newest version (2:1.11-68ubuntu1~18.04.1).

V tomto případě není co instalovat.

Instalace Javy na Ubuntu

Nejdřív zjistíme, zda je Java již nainstalována či ne.

java -version

Command 'java' not found, but can be installed with:

apt install default-jre
apt install openjdk-11-jre-headless
apt install openjdk-8-jre-headless

Jak je z výpisu patrné, nainstalována není. Pokud potřebujete JDK, naistalujete jej pomocí:

apt install default-jdk

Když po instalaci zkontroluje verzi, objeví se vám podobný výpis.

java -version
openjdk version "10.0.2" 2018-07-17
OpenJDK Runtime Environment (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)
OpenJDK 64-Bit Server VM (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4, mixed mode)

Ubuntu, Nginx a Tomcat

Nginx je webobý server, který má mít oproti Apache lepší výkon. Tomcat je webový kontejner, ve kterém běží Java webové aplikace. Tomcat po spuštění poslouchá na portu 8080. Pokud nasadíte Java webovou aplikaci na Tomcatu, budete muset pro přístup k ní za url dodat port 8080, takže url by vypadala následovně: www.mojeaplikace.cz:8080. Uživatel, připojující se k takovéto aplikaci, si něco takového určitě pamatovat nebude. Řešením je nainstalovat webový server (Apache, Nginx, …) a přesměrovat provoz na Tomcat. V tomto příspěvku ukáži konfiguraci Nginx na Ubuntu, kdy Nginx bude směrovat provoz z portu 80 na port 8080. Aplikace tedy bude přístupná na očekávané url www.mojeaplikace.cz.

Instalace Nginx

apt-get install nginx

Konfigurační soubor pro Nginx je /etc/nginx/sites-available/default.

server {
  listen          80;
  server_name     mojeaplikace.cz www.mojeaplikace.cz;

  location / {
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://localhost:8080/;
  }
}

Je dobré si ověřit, že jste v konfiguračním souboru nic nepokopali

nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Provedeme reload Nginx

systemctl reload nginx

Zdroj: djamware.com/post/…and-java-8-on-ubuntu-1604

Proudy v Java 8

Proudové (stream) zpracovávání je novinka Javy 8. Cílem je zjednodušit operace nad posloupnostmi prvků. Umožňují zřetězení operací. Operace se dělí do dvou hlavních skupin:

  • terminální (terminal) – touto operací je proud uzavřen
  • neterminální (intermediate) – vytváří nový proud

Jak je vidět z popisu, neterminální operace lze za sebou řetězit, dokud se nezavolá operace terminální.

Nejpoužívanější operace jsou

forEach terminální všechny prvky proudu postupně odešle konzumentovi
findFirst terminální vrátí první prvek pokud existuje
collect terminální sesbírá elementy a vytvoří z nich návratovou strukturu
map neterminální převede prvky na jiné
filter neterminální filtruje podle zadaného predikátu (podmínky)
sorted neterminální seřadí prvky

Příklady použití.

Číst dálProudy v Java 8

Testování private static final proměnné

Při testování se můžeme setkat s tím, že potřebujeme otestovat funkcionalitu, která není přes vystavené API přístupná. Jako příklad zde uvedu třídu Extractor. Jedná se o třídu, která čte soubor z přesně zadaného umístění. Z toho důvodu je soubor zadán jako private static final. Jak otestovat metodu getContent(), když nemáme přístup k souboru C:\input.txt (nemůžeme tento soubor modifikovat a dokonce tento soubor ani nemusí v době testů existovat)? Řešením je použít reflexi.

Extractor.java

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class Extractor {
	private static final File INPUT = new File("C:\\input.txt");
	
	public Extractor() {}
	
	public String getContent() {
		String result = "";
		try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(INPUT), "UTF-8"))) {
			String line;
			while ((line = br.readLine()) != null) {
				result = result + line;
			}
		} catch (IOException ioe) {
			ioe.printStackTrace();
		}
		return result;
	}
}

Testovací soubor testinput.txt umístěný v src/test/resources.

Číst dálTestování private static final proměnné

Ignorování JUnit testů

V případě, že potřebujete, aby se některé JUnit testy nespouštěly, nabízí JUnit anotaci @Ignore (javadoc).

import org.junit.Ignore;
import org.junit.Test;

public class JUnitIgnoreTest {

	@Ignore
	@Test
	public void test1() {
		assertEquals(11, 22);
	}

	@Test
	public void test2() {
		assertEquals(2, 2);
	}
}

junit-ignore-annotace

Je vidět, test byl ignorován. Pokud bychom anotaci @Ignore v tomto případě zakomentovali, test by spadl. Anotaci je možné použít na celou třídu. V tom případě se neprovede žádný test z této třídy.