Java Stream

Java の Stream を使ってみます。

環境

2. Java 11 でビルドする

Java11 でビルドするように pom.xml に以下を追加します。
ついでに、テスト用の依存関係を追加します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<properties>
<java.version>11</java.version>
</properties>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.11.1</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>

追加後の内容は以下のようになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.kujilabo</groupId>
<artifactId>java-stream</artifactId>
<version>1.0.0-SNAPSHOT</version>

<properties>
<java.version>11</java.version>
</properties>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.11.1</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

pom.xml を右クリックし、 Maven -> Reimport をクリックしインポートしておきます。

2. Stream を使う

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package com.kujilabo;

import org.junit.Test;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class StreamTest {
@Test
public void stringToInteger() {
// 文字列の長さを取得します。
List<String> list1 = Arrays.asList("apple", "orange", "strawberry");
List<Integer> list2 = list1.stream().map(String::length).collect(Collectors.toList());
System.out.println(list2); // [5, 6, 10]
}

@Test
public void listToMap() {
// リストをマップに変換します。マップのキーは文字列、値は文字列の長さです。
List<String> list1 = Arrays.asList("apple", "orange", "strawberry");
Map<String, Integer> map1 = list1.stream().collect(Collectors.toMap(Function.identity(), String::length));
System.out.println(map1); // {orange=6, apple=5, strawberry=10}
// toMap の第1引数はキーを返す関数、第2引数は値を返す関数を渡します。
// Function.identity は 引数をそのまま返す関数です。
// つまり、以下と同じです。
// Map<String, Integer> map2 = list1.stream().collect(Collectors.toMap(x -> x, x -> x.length()));
}

@Test
public void intStream() {
// int の連番リストはIntStreamで作成できます。
// IntStream を Stream<Integer> に変換するには boxed を使います。
List<Integer> list1 = IntStream.range(0, 10).boxed().collect(Collectors.toList());
System.out.println(list1); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
}

@Test
public void withIndex() {
// 配列の添字を使いたい場合の例です。
List<String> list1 = Arrays.asList("apple", "orange", "strawberry");
List<String> list2 = IntStream.range(0, list1.size())
.mapToObj(i -> i + " " + list1.get(i))
.collect(Collectors.toList());
System.out.println(list2); // [0 apple, 1 orange, 2 strawberry]
}

@Test
public void sort() {
// 文字列の長さ昇順でソート
List<String> list1 = Arrays.asList("orange", "strawberry", "apple");
List<String> list2 = list1.stream()
.sorted(Comparator.comparing(String::length))
.collect(Collectors.toList());
System.out.println(list2); // [apple, orange, strawberry]
}

@Test
public void reverse() {
// 文字列の長さ降順でソート
List<String> list1 = Arrays.asList("orange", "strawberry", "apple");
List<String> list2 = list1.stream()
.sorted(Comparator.comparing(String::length).reversed())
.collect(Collectors.toList());
System.out.println(list2); // [strawberry, orange, apple]
}
}