talosのプログラミング教室

Java Gold合格への道 ~アサーション~

こんにちは。たろすです。

今回はアサーションについて説明します。

アサーションとは

アサーションはプラグラムが正しく動作していることを確認するための機能です。

以下のように書きます。

assert 条件式;

または

assert 条件式 : 引数;

使い方

public static void main(String[] args) {
	int x = 10;
	assert x == 5 : "NG";
	System.out.println("OK");
}

アサーションを有効にするためには実行する際に「-ea」オプションをつけます。
(eaはenable assertionsの略です)

実行すると条件式がfalseになるため例外が投げられプログラムが終了します。

Exception in thread "main" java.lang.AssertionError: NG
	at assertion.Main.main(Main.java:7)

xの値を5にすると条件式がtrueになり、「OK」が出力されます。

おわりに

今回はアサーションについて説明しました。

Java Gold合格への道 ~AutoClosableインタフェース~

こんにちは。たろすです。

今回はAutoClosableインタフェースについて説明します。

使い方

AutoClosableインタフェースはtry-with-resourcesで自動でクローズさせたい場合に実装する必要があります。

closeメソッドをオーバーライドしてクローズ処理を書きます。

以下のように使用します。

public class X implements AutoCloseable {
	
	@Override
	public void close() {
		System.out.println("Closed!!");
	}
}
public class Main {

	public static void main(String[] args) {
		try (X x = new X()) {
			System.out.println("Start!!");
		}
	}
}
Start!!
Closed!!

おわりに

今回はAutoClosableインタフェースについて説明しました。

Java Gold合格への道 ~multi-catch~

こんにちは。たろすです。

今回はmulti-catchについて説明します。

使い方

multi-catchは一つのcatchブロックで複数の例外をキャッチする方法です。

public static void main(String[] args) {
	try {
		x();
	} catch (IOException | NullPointerException e) {  // multi-catch
		e.printStackTrace();
	}
}

public static void x() throws IOException {
	throw new IOException();
}


ただし、継承関係にある例外は一つのcatchブロックにまとめられません。

public static void main(String[] args) {
	try {
		x();
	} catch (IOException | Exception e) {  // コンパイルエラー
		e.printStackTrace();
	}
}

public static void x() throws IOException {
	throw new IOException();
}

おわりに

今回はmulti-catchについて説明しました。

Java Gold合格への道 ~例外の再スロー~

こんにちは。たろすです。

今回は例外の再スローについて説明します。

例外の再スロー

例外をキャッチした後に再度例外をスローすることができます。

その際に引数に元の例外を指定することで、元の例外を受け渡すことができます。

public static void main(String[] args) {
	try {
		x();
	} catch (Exception e) {
		e.printStackTrace();
	}
}

public static void x() throws Exception {
	try {
		y();
	} catch (Exception e) {
		throw new Exception("x", e);  // 例外の受け渡し
	}
}

public static void y() throws Exception {
	try {
		z();
	} catch (Exception e) {
		throw new Exception("y", e);  // 例外の受け渡し
	}
}

public static void z() throws Exception {
	throw new Exception("z");
}

元の例外の取り出し

受け渡されてきた例外はgetCauseメソッドによって取り出すことができます。

public static void main(String[] args) {
	try {
		x();
	} catch (Throwable e) {
		while (e != null) {
			System.out.println(e.getMessage());
			e = e.getCause();  // 例外の取り出し
		}
	}
}

public static void x() throws Exception {
	try {
		y();
	} catch (Exception e) {
		throw new Exception("x", e);
	}
}

public static void y() throws Exception {
	try {
		z();
	} catch (Exception e) {
		throw new Exception("y", e);
	}
}

public static void z() throws Exception {
	throw new Exception("z");
}
x
y
z

おわりに

今回は例外の再スローについて説明しました。

Java Gold合格への道 ~StreamAPI・可変リダクション操作~

こんにちは。たろすです。

今回はStreamAPIの可変リダクション操作について説明します。

可変リダクション操作とは

可変リダクション操作とは、ストリームの要素を可変コンテナに収集する操作をいいます。

可変リダクション操作にはcollectメソッドを使います。

collectメソッドは引数にCollectorオブジェクトを取ります。

以下のように使用します。

List<String> list = Stream.of("A", "B", "C").collect(Collectors.toList());
System.out.println(list);
[A, B, C]

toListは入力要素を新しいListに蓄積するCollectorを返します。

わかりずらいのでストリームをListにするCollectorオブジェクトと覚えておきましょう。

他にもCollectorsクラスには様々なメソッドがあるので気になる方は調べてみてください。

※Collectorsはクラス、Collectorはインタフェースです。

おわりに

今回はStreamAPIの可変リダクション操作について説明しました。

Java Gold合格への道 ~StreamAPI・reduce~

こんにちは。たろすです。

今回はStreamAPIのreduceについて説明します。

使い方

reduceは開発者がリダクション処理をカスタマイズするためのメソッドです。

以下のように使用します。

int[] array = { 1, 2, 3 };
IntStream stream = Arrays.stream(array);
System.out.println(stream.reduce((x, y) -> x * y));
OptionalInt[6]

上記はストリーム内のすべての要素を掛け合わせるコードです。

まず、xに1、yに2が入り、掛け算が実行されます。

その後、xに一度目の計算の結果である2が入り、yに3が入って掛け算が実行されることで結果は6になります。


また、初期値を設定することもできます。

int[] array = { 1, 2, 3 };
IntStream stream = Arrays.stream(array);
System.out.println(stream.reduce(2, (x, y) -> x * y));
12

一つ目の引数が初期値で、初期値にそれぞれの要素が掛け合わされていくため、結果は12になります。

こちらの戻り値はOptionalではないので要注意です。

おわりに

今回はStreamAPIのreduceについて説明しました。

Java Gold合格への道 ~StreamAPI・リダクション~

こんにちは。たろすです。

今回はStreamAPIのリダクションについて説明します。

リダクションとは

データの集合を要約するような終端操作をリダクションと呼びます。

count

ストリームの要素数を返すメソッドです。

int[] array = { 4, 7, 2, 5, 2, 6 };
IntStream stream = Arrays.stream(array);
System.out.println(stream.count());
6

average

ストリームの要素の平均値を含むOptionalを返すメソッドです。。

int[] array = { 4, 7, 2, 5, 2, 6 };
IntStream stream = Arrays.stream(array);
System.out.println(stream.average());
OptionalDouble[4.333333333333333]

max

ストリームの要素の最大値を含むOptionalを返すメソッドです。

int[] array = { 4, 7, 2, 5, 2, 6 };
IntStream stream = Arrays.stream(array);
System.out.println(stream.max());
OptionalInt[7]

min

ストリームの要素の最小値を含むOptionalを返すメソッドです。

int[] array = { 4, 7, 2, 5, 2, 6 };
IntStream stream = Arrays.stream(array);
System.out.println(stream.min());
OptionalInt[2]

sum

ストリームの要素の合計を返すメソッドです。

int[] array = { 4, 7, 2, 5, 2, 6 };
IntStream stream = Arrays.stream(array);
System.out.println(stream.sum());
26

おわりに

今回はStreamAPIのリダクションについて説明しました。