talosのプログラミング教室

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

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

今回はStreamAPIのsortedの使い方について説明します。

使い方

sortedはStreamの要素をソートするメソッドです。

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

Arrays.asList(2, 5, 4, 1, 3)
.stream()
.sorted()
.forEach(System.out::print);
12345

引数なしの場合、自然順序でソートします。

StreamインタフェースのsortedメソッドはCoparatorオブジェクトを引数にとることができ、任意の順にソートすることができます。
(IntStreamなどは引数をとることはできません。)

Arrays.asList(2, 5, 4, 1, 3)
.stream()
.sorted((i, j) -> j - i)
.forEach(System.out::print);
54321

おわりに

今回はStreamAPIのsortedの使い方について説明しました。

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

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

今回はStreamAPIのmapの使い方について説明します。

使い方

mapはStreamの要素をマッピング(=データ集合における個々のデータを別のデータに変換した新しいデータ集合を生成)するメソッドです。

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

int[] array = { 1, 2, 3, 4, 5 };
IntStream stream = Arrays.stream(array);
stream.map(num -> num * 2).forEach(System.out::print);
246810

filterの引数はFunctionの実装で、Functionを適用した新しいStreamオブジェクトを返します。

おわりに

今回はStreamAPIのmapの使い方について説明しました。

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

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

今回はStreamAPIのfilterの使い方について説明します。

使い方

fileterはStreamの要素をフィルタリング(=必要な要素のみを抽出)するメソッドです。

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

int[] array = { 1, 2, 3, 4, 5 };
IntStream stream = Arrays.stream(array);
stream.filter(num -> num >= 3).forEach(System.out::print);
345

filterの引数はPredicateの実装で、結果がtrueの場合のみフィルタを通過します。

おわりに

今回はStreamAPIのfilterの使い方について説明しました。

Java Gold合格への道 ~StreamAPI・ファイル読み込み~

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

今回はjava.io.BufferedReaderとjava.nio.file.Filesのlinesメソッドの使い方について説明します。

両者ともファイルから読み込んだ文字列をStreamオブジェクトとして扱うことができます。

使い方

java.io.BufferedReader

try (BufferedReader br = new BufferedReader(new FileReader("file/sample.txt"))) {
	br.lines().forEach(System.out::println);
} catch (IOException e) {
	e.printStackTrace();
}

BufferedReaderはtry with resourcesでインスタンス化しているのでcloseする必要はありません。

java.nio.file.Files

try {
	Path path = Paths.get("file/sample.txt");
	Files.lines(path).forEach(System.out::println);
} catch (IOException e) {
	e.printStackTrace();
}

FilesのlinesメソッドはPathオブジェクトを引数にとるstaticメソッドです。

BufferedReaderのlinesメソッドと混同しないように注意しましょう。

おわりに

今回はjava.io.BufferedReaderとjava.nio.file.Filesのlinesメソッドの使い方について説明しました。

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

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

今回はstreamAPIのofの使い方について説明します。

使い方

ofは任意のオブジェクト集合からStreamオブジェクトを取得する際に使用します。

public class X {
	public String toString() {
		return "X";
	}
}
public class Y {
	public String toString() {
		return "Y";
	}
}
X x = new X();
Y y = new Y();
Stream<Object> stream = Stream.of(x, y);
stream.forEach(System.out::print);
XY

IntStreamやLongStream、DoubleStreamにもそれぞれ用意されています。

おわりに

今回はstreamAPIのofの使い方について説明しました。

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

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

今回はstreamAPIの範囲指定について説明します。

rangeとrangeClosed

for文で範囲を指定できるように、IntStreamやLongStreamでもforEachで範囲指定したい場合があります。

そのためにrangeとrangeClosedが存在します。

この二つの違いは範囲の最後の値を含む(range)か含まない(rangeClosed)かです。

使い方

range

IntStream.range(1, 3).forEach(System.out::print);
12

rangeClosed

IntStream.rangeClosed(1, 3).forEach(System.out::print);
123

おわりに

今回はstreamAPIの範囲指定について説明しました。

Java Gold合格への道 ~StreamAPI・MapのforEach~

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

今回はMapのforEachについて説明します。

java.util.streamのforEachとの違い

java.util.streamのforEachは以下のように定義されています。

void forEach(Consumer<? super T> action)

一方でMapのforEachは以下のように定義されています。

default void forEach(BiConsumer<? super K,? super V> action)

引数がBiConsumerになっています。


どういうことかコードを見ていきます。

まずはjava.util.steramのforEachの使い方です。

int[] array = { 1, 2, 3, 4, 5 };
IntStream stream = Arrays.stream(array);
stream.forEach(n -> System.out.print(n));

次にMapのforEachの使い方です。

Map<String, String> map = new HashMap<>();
map.put("k1", "v1");
map.put("k2", "v2");
map.forEach((k, v) -> System.out.print(k + v));

ラムダ式の引数が二つになっています。

また、java.util.streamのforEachの引数は「System.out::print」とメソッド参照にすることができますが、Mapのほうは変数が二つあるためメソッド参照は使えません。

おわりに

今回はMapのforEachについて説明しました。