001package org.reactivestreams.tck.support; 002 003import java.util.NoSuchElementException; 004 005// simplest possible version of Scala's Option type 006public abstract class Optional<T> { 007 008 private static final Optional<Object> NONE = new Optional<Object>() { 009 @Override 010 public Object get() { 011 throw new NoSuchElementException(".get call on None!"); 012 } 013 014 @Override 015 public boolean isEmpty() { 016 return true; 017 } 018 }; 019 020 private Optional() { 021 } 022 023 @SuppressWarnings("unchecked") 024 public static <T> Optional<T> empty() { 025 return (Optional<T>) NONE; 026 } 027 028 @SuppressWarnings("unchecked") 029 public static <T> Optional<T> of(T it) { 030 if (it == null) return (Optional<T>) Optional.NONE; 031 else return new Some(it); 032 } 033 034 public abstract T get(); 035 036 public abstract boolean isEmpty(); 037 038 public boolean isDefined() { 039 return !isEmpty(); 040 } 041 042 public static class Some<T> extends Optional<T> { 043 private final T value; 044 045 Some(T value) { 046 this.value = value; 047 } 048 049 @Override 050 public T get() { 051 return value; 052 } 053 054 @Override 055 public boolean isEmpty() { 056 return false; 057 } 058 059 @Override 060 public String toString() { 061 return String.format("Some(%s)", value); 062 } 063 } 064 065 @Override 066 public String toString() { 067 return "None"; 068 } 069}