文字列

オブジェクトを文字列へ変換(Apache Commons Lang)

String str1 = new ReflectionToStringBuilder(this).toString();
String str2 = ToStringBuilder.reflectionToString(this);

コレクション各要素処理

コレクションの全要素をそれぞれ処理する。

Java1.4の場合は、イテレータを使用する。

Iterator ite = list.iterator();
while (ite.hasNext()) {
	String str = (String) ite.next();
	System.out.println(str);
}

Java5の場合は、拡張for文が使える。

for (String e : list) {
	System.out.println(e);
}

Java8の場合は、ラムダ式が使える。

// ラムダ式
list.forEach((str) -> {
	System.out.println(str);
});
// ラムダ式にメソッド参照を渡す。
list.forEach(System.out::println);

入出力ストリーム

String→InputStream変換

InputStream is = new ByteArrayInputStream("Hello".getBytes("UTF-8"));

実行中のメソッド名取得

実行中のメソッド名は、次のようにして取得できる。ただし、パフォーマンス悪いので注意。

String methodName = new Throwable().getStackTrace()[0].getMethodName();

ユーティリティメソッド化するなら、次のように書ける。

public class AppUtil {
	/**
	 * 現在メソッド名を取得する。
	 */
	public static String getMethod() {
		return new Throwable().getStackTrace()[1].getMethodName();
	}
}

ラムダ式(Java8以降)

Java8からラムダ式が導入されました。これにより、今まで関数型インタフェースなどで記述していたメソッド引数が書きやすくなりました。

次のようなメソッドがあったとします。

// 呼び出し対象メソッド
private static void runLambda(FuncInterface action) {
	action.run("Hello World");
}
// 独自の関数型インタフェース
private interface FuncInterface {
	public void run(String msg);
}

上記メソッドを呼び出すとき、Java7までは、次のように書きました。

runLambda(new FuncInterface() {
	@Override
	public void run(String msg) {
		System.out.println(msg);
	}
});

Java8からは次のように書けるようになります。

runLambda((msg) -> {
	System.out.println(msg);
});

上記では関数型インタフェースを独自に定義しましたが、Java8では、いくつかの関数型インタフェースがあらかじめ用意されるようになりました。詳細は、下記リンクを参照。

ストリームAPI(Java8以降)

Java8からストリームAPIが導入された。これにより、コレクションが操作しやすくなり、並列処理のパフォーマンス向上が期待できるらしい。 入出力ストリームとは無関係。

たとえば、今まで、次のように記述していたのが、

long count = 0;
for (String e : list) {
	if (e.length() > 4) {
		count++;
	}
}
System.out.println(count);

Java8からは、次のように書ける。

long count = list.stream().filter(w -> w.length() > 4).count();
System.out.println(count);