Aktuální pozice ve formátu řádek:sloupec se zobrazuje v levé spodní části okna IDE (společně s informací o kódování a znaku pro oddělování řádků).
Java
Vrácení smazaného souboru v Idea IDE
Pokud v Idea IDE smažete soubor, můžete tuto akci vrátit zpět pomocí lokální historie. Pravým tlačítkem na projekt -> Local History -> Show History.
V tomto případě jsem smazal soubor pokus.sql.
Pokud chceme soubor vrátit -> pravým tlačítkem na soubor -> Revert Selection nebo na akci a Revert.
Pokud vyberete File -> Invalidate Caches / Restart, přijdete o lokální historii a tím pádem i o tuto možnost vrácení smazaného souboru.
Vyhledání speciálního znaku v kódu v Idea IDE
Pokud v potřebujete ve svém projektu vyhledávat, v Idea IDE k tomu slouží klávesová zkratka Ctrl + Shift + F (Edit -> Find -> Find in Path …).
Problém nastává v případě, že chcete vyhledávat text obsahující speciální znaky např. [, *, $, ), … Řešením je přidat před speciální znak zpětné lomítko \.
Takto byste např. v projektu vyhledali výskyt pole int.
int\[\]
A takto všechny dotazy do databáze obsahující *.
select \*
Vytvoření seznamu z množiny v Javě
Datový typ Set (množina) je kolekce prvků, kdy každý z prvků se v množině může vyskytovat maximálně jednou. Set se používá jako struktura, která odfiltruje duplicity. Následně je ale často potřeba převést Set na seznam (List). Díky tomu, že Set implementuje rozhraní Collection, je možné použít konstruktor new ArrayList<>(set).
Set set = new HashSet<>(); set.add(7L); set.add(2L); set.add(19L); set.add(7L); set.add(7L); set.add(2L); List list = new ArrayList<>(set); System.out.println(Arrays.toString(list.toArray()));
Výsledek
[2, 19, 7]
V případě, že Set je prázdný, vytvoří se prázdný List.
Set set = new HashSet<>(); List list = new ArrayList<>(set); System.out.println(Arrays.toString(list.toArray()));
Výsledek
[]
Ahoj světě v JavaFX 8
JavaFX je soubor java balíčků, které umožňují vývoj grafických aplikací v Javě. Dříve k tomuto účelu sloužily knihovny AWT a poté Swing. JavaFX je nástupcem Swingu a verze JavaFX 8 je nyní nejaktuálnější.
Takto vypadá jednoduchá grafická aplikace v JavaFX.
A toto je její kód.
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Button button = new Button();
final Text message = new Text();
button.setText("Řekni ahoj");
button.setOnAction((event) -> message.setText("Ahoj"));
VBox layout = new VBox(5, button, message);
layout.setAlignment(Pos.CENTER);
Scene scene = new Scene(layout, 200, 150);
primaryStage.setTitle("Ahoj světe");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Názvosloví v JavaFX je inspirováno divadlem (divadelní hrou). Hra se skládá z jednotlivých scén (scenes), které jsou hrány na jevišti (stage). Objekt typu Stage máme k dispozici. Do něj vložíme objekt typu Scene. Do scény se vkládá kontejner, který sdružuje další komponenty a umisťuje je.
Porovnávání času v joda.time
Instance org.joda.time.DateTime obsahuje údaje o datumu a čase. Instance org.joda.time.DateTime obsahuje údaje pouze o datumu. Pro porovnávání instancí na to, který čas nastal dříve či později, poskytuje knihovna joda metody isAfter() a isBefore(). Pozor na to, že pokud vrací isAfter() true, znamená to, že čas nastal po určitém čase a pokud isBefore() vrací true, tak daný čas nastal před určitým časem.
DateTime now = DateTime.now(); DateTime past = DateTime.now().minusDays(2); DateTime future = DateTime.now().plusMonths(5); System.out.println(now.isAfter(past)); System.out.println(now.isBefore(past)); System.out.println(now.isAfter(future)); System.out.println(now.isBefore(future)); System.out.println(); // porovnávám dva stejné časy System.out.println(now.toLocalDate().isAfter(now.toLocalDate())); // porovnávám aktuální čas s časem plus tři dny do budoucna System.out.println(now.toLocalDate().isBefore(LocalDate.now().plusDays(3)));
Výsledek
true false false true false true
Odstranění položky ze seznamu při průchodu
Mějme následující seznam
List list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
Zkusme z něj odstranit položku.
for (String item : list) {
if (item.equals("a")) {
list.remove(item);
}
}
Jakýkoliv pokus o odsranění položky ze seznamu tímto způsobem vyhodí java.util.ConcurrentModificationException. Zkusme tedy použít klasický cyklus a přistoupit k položce pomocí indexu.
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("a")) {
System.out.println("removing");
list.remove(i);
}
}
Výsledek je [b, c, d] což je správně a nedošlo k vyhození výjimky.
Zkusme ale odstranit „b“ a zároveň „c“.
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("b") || list.get(i).equals("c")) {
System.out.println("removing");
list.remove(i);
}
}
K chybě nedošlo, ale výsledek je [a, c, d], což je špatně. Odstranili jsme „b“, seznam se zmenšil a „c“ se posunulo na index 1 (kde bylo původně „d“). Cyklus ale pokračoval na indexu 2. Pokud bychom chtěli správný výsledek, kód by vypadal následovně.
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("b") || list.get(i).equals("c")) {
System.out.println("removing");
list.remove(i);
i--;
}
}
Pro modifikaci seznamu je nejlepší použít iterátor.
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (item.equals("b") || item.equals("c")) {
iterator.remove();
}
}
OutOfMemoryError při testech
V případě, že dostanete následující chybu při Maven buildu (mvn clean install)
Tests run: 226, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 316.116 sec - in TestSuite Exception in thread "main" Exception in thread "Thread-0" Picked up JAVA_TOOL_OPTIONS: -Djava.vendor="Sun Microsystems Inc." Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main" Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "Thread-0" Results : Tests run: 226, Failures: 0, Errors: 0, Skipped: 0 [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] [INFO] CEB UMA Parent ..................................... SUCCESS [ 5.639 s] [INFO] CEB UMA API ........................................ SUCCESS [ 15.656 s] [INFO] CEB UMA Impl ....................................... FAILURE [05:37 min] [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 05:59 min [INFO] Finished at: 2016-03-29T15:08:52+02:00 [INFO] Final Memory: 43M/272M [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.16:test (default-test) on project project_name: Execution de fault-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.16:test failed: The forked VM terminated without saying properly goodbye . VM crash or System.exit called ?
Zkuste změnit nastavení paměti určené pro surefire plugin.
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <argLine>-Xmx4096m</argLine> </configuration> </plugin>
Surefire plugin se používá pro spouštění testů v lifecycle default, fázi test a výše uvedená chyba může signalizovat nedostatek paměti. Volba -Xmx určuje maximální velikost paměti (maximální velikost Java heap). Java heap (halda) je paměť určená pro Java objekty.
Základní názvosloví v Mavenu
Build life cycle
Build life cycle je přesně definovaná posloupnost fází. Build life cycle se skládá z několika úseků, kroků -> ty se nazývají fáze (phases). Maven má tři build life cycles: clean (smazání dočasných souborů, default (sestavení, zabalení a nasazení projektu) a složky target) a site.
Phase
Phase je část, která se provádí v rámci build life cyklu. Fáze může obsahovat jeden nebo více úkolů (goals) -> fáze je spojena s jedním nebo více cíli (goals).
Plugin
Plugin obsahuje jeden nebo více cílů (goals). Jednoduše řečeno je plugin seznam jednotlivých cílů. Programátorsky se jedná o projekt, který obsahuje jednotlivé třídy, ve kterých je definována funkcionalita určitého cíle (goal).
Goal vs MOJO
Mojo je zkratka (Maven Old Java Object). Je to slovní hříčka z POJO (Plain Old Java Object). Mojo je Java třída implementující goal. Plugin je Java projekt obsahující jeden či více cílů (goal) = jeden či více Mojo.
Build life cycle (maven má tři: clean, default, site) se skládá z fází (phases). Během každé fáze se provádí různé úkoly (goals). Cíle jsou definovány v pluginech a proto, aby se v určité fázi provedli, jsou tyto cíle (goals) přiřazeny jednotlivým fázím. Jinak řečeno, jednotlivým fázím jsou přiřazeny cíle (goals) a tyto cíle (goals) jsou definovány v pluginech. Programově každý goal představuje mojo a plugin je seznamem jednotlivých cílů (goals).
Zdroje:
Vícenásobný kurzor v Idea IDE
Několika násobný kurzor umožňuje měnit soubor zároveň na více místech. Pokud máme například následující objekt
public class MyObject {
private Long id;
private Long number;
private Long sequence;
public MyObject(Long id, Long number, Long sequence) {
this.id = id;
this.number = number;
this.sequence = sequence;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getNumber() {
return number;
}
public void setNumber(Long number) {
this.number = number;
}
public Long getSequence() {
return sequence;
}
public void setSequence(Long sequence) {
this.sequence = sequence;
}
}
a chceme změnit datový typ proměnné id z Long na long (nelze použít „type migration“), můžeme buď jednotlivě přepsat každý odpovídající výskyt (pokud bychom použili najít a zaměnit, změnily by se všechny výskyty), nebo použít multicursor. Klávesová zkratka pro vícenásobný kurzor je Alt + Shift a následně je třeba klikat na místa, kam chceme kurzor umístit.







