Functional
Optional: map と flatMap はOptionalのネストをどう扱うかが違う
関数が Optional を返すとき、map は二重にし、flatMap は一段だけ平坦化します。
SourceOptionalMapping.java
Java 21
package examples.optional;
import java.util.Optional;
public final class OptionalMapping {
private OptionalMapping() {}
public static Optional<Optional<String>> withMap(Optional<String> value) {
return value.map(Optional::of);
}
public static Optional<String> withFlatMap(Optional<String> value) {
return value.flatMap(Optional::of);
}
}TestOptionalMappingTest.java
Java 21
package examples.optional;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.Optional;
import org.junit.jupiter.api.Test;
class OptionalMappingTest {
@Test
void mapはOptionalを返す関数に対してOptionalを二重にする() {
assertEquals(
Optional.of(Optional.of("member")), OptionalMapping.withMap(Optional.of("member")));
}
@Test
void flatMapはOptionalを返す関数の結果を平坦化する() {
assertEquals(Optional.of("member"), OptionalMapping.withFlatMap(Optional.of("member")));
}
}01Assertion
このテストで確認できること
- map は Optional<Optional<String>> を返す
- flatMap は Optional<String> を返す
変換関数の戻り値が Optional なら flatMap を選びます。二重の Optional を後段へ渡さないためです。
OBSERVED RESULT
map: Optional[Optional[member]]
flatMap: Optional[member]