1cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath/* 2cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. 3cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 5cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * This code is free software; you can redistribute it and/or modify it 6cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * under the terms of the GNU General Public License version 2 only, as 7cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * published by the Free Software Foundation. Oracle designates this 8cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * particular file as subject to the "Classpath" exception as provided 9cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * by Oracle in the LICENSE file that accompanied this code. 10cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 11cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * This code is distributed in the hope that it will be useful, but WITHOUT 12cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * version 2 for more details (a copy is included in the LICENSE file that 15cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * accompanied this code). 16cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 17cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * You should have received a copy of the GNU General Public License version 18cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 2 along with this work; if not, write to the Free Software Foundation, 19cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 21cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * or visit www.oracle.com if you need additional information or have any 23cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * questions. 24cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath */ 25cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamathpackage java.util; 26cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath 27cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamathimport java.util.function.IntConsumer; 28cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamathimport java.util.function.IntSupplier; 29cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamathimport java.util.function.Supplier; 30cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath 31a9c2fed8a47b493f4f924ce5134e084767596b57Przemyslaw Szczepaniak// Android-changed: removed ValueBased paragraph. 32cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath/** 33cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * A container object which may or may not contain a {@code int} value. 34cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * If a value is present, {@code isPresent()} will return {@code true} and 35cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * {@code getAsInt()} will return the value. 36cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 37cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * <p>Additional methods that depend on the presence or absence of a contained 38cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * value are provided, such as {@link #orElse(int) orElse()} 39cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * (return a default value if value not present) and 40cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * {@link #ifPresent(java.util.function.IntConsumer) ifPresent()} (execute a block 41cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * of code if the value is present). 42cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 43cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @since 1.8 44cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath */ 45cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamathpublic final class OptionalInt { 46cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath /** 47cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * Common instance for {@code empty()}. 48cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath */ 49cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath private static final OptionalInt EMPTY = new OptionalInt(); 50cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath 51cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath /** 52cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * If true then the value is present, otherwise indicates no value is present 53cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath */ 54cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath private final boolean isPresent; 55cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath private final int value; 56cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath 57cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath /** 58cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * Construct an empty instance. 59cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 60cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @implNote Generally only one empty instance, {@link OptionalInt#EMPTY}, 61cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * should exist per VM. 62cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath */ 63cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath private OptionalInt() { 64cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath this.isPresent = false; 65cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath this.value = 0; 66cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath } 67cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath 68cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath /** 69cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * Returns an empty {@code OptionalInt} instance. No value is present for this 70cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * OptionalInt. 71cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 72cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @apiNote Though it may be tempting to do so, avoid testing if an object 73cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * is empty by comparing with {@code ==} against instances returned by 74cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * {@code Option.empty()}. There is no guarantee that it is a singleton. 75cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * Instead, use {@link #isPresent()}. 76cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 77cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @return an empty {@code OptionalInt} 78cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath */ 79cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath public static OptionalInt empty() { 80cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath return EMPTY; 81cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath } 82cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath 83cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath /** 84cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * Construct an instance with the value present. 85cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 86cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @param value the int value to be present 87cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath */ 88cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath private OptionalInt(int value) { 89cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath this.isPresent = true; 90cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath 91cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath this.value = value; 92cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath } 93cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath 94cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath /** 95cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * Return an {@code OptionalInt} with the specified value present. 96cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 97cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @param value the value to be present 98cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @return an {@code OptionalInt} with the value present 99cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath */ 100cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath public static OptionalInt of(int value) { 101cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath return new OptionalInt(value); 102cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath } 103cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath 104cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath /** 105cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * If a value is present in this {@code OptionalInt}, returns the value, 106cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * otherwise throws {@code NoSuchElementException}. 107cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 108cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @return the value held by this {@code OptionalInt} 109cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @throws NoSuchElementException if there is no value present 110cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 111cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @see OptionalInt#isPresent() 112cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath */ 113cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath public int getAsInt() { 114cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath if (!isPresent) { 115cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath throw new NoSuchElementException("No value present"); 116cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath } 117cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath return value; 118cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath } 119cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath 120cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath /** 121cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * Return {@code true} if there is a value present, otherwise {@code false}. 122cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 123cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @return {@code true} if there is a value present, otherwise {@code false} 124cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath */ 125cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath public boolean isPresent() { 126cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath return isPresent; 127cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath } 128cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath 129cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath /** 130cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * Have the specified consumer accept the value if a value is present, 131cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * otherwise do nothing. 132cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 133cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @param consumer block to be executed if a value is present 134cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @throws NullPointerException if value is present and {@code consumer} is 135cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * null 136cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath */ 137cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath public void ifPresent(IntConsumer consumer) { 138cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath if (isPresent) 139cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath consumer.accept(value); 140cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath } 141cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath 142cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath /** 143cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * Return the value if present, otherwise return {@code other}. 144cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 145cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @param other the value to be returned if there is no value present 146cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @return the value, if present, otherwise {@code other} 147cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath */ 148cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath public int orElse(int other) { 149cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath return isPresent ? value : other; 150cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath } 151cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath 152cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath /** 153cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * Return the value if present, otherwise invoke {@code other} and return 154cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * the result of that invocation. 155cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 156cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @param other a {@code IntSupplier} whose result is returned if no value 157cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * is present 158cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @return the value if present otherwise the result of {@code other.getAsInt()} 159cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @throws NullPointerException if value is not present and {@code other} is 160cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * null 161cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath */ 162cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath public int orElseGet(IntSupplier other) { 163cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath return isPresent ? value : other.getAsInt(); 164cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath } 165cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath 166cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath /** 167cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * Return the contained value, if present, otherwise throw an exception 168cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * to be created by the provided supplier. 169cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 170cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @apiNote A method reference to the exception constructor with an empty 171cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * argument list can be used as the supplier. For example, 172cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * {@code IllegalStateException::new} 173cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 174cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @param <X> Type of the exception to be thrown 175cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @param exceptionSupplier The supplier which will return the exception to 176cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * be thrown 177cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @return the present value 178cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @throws X if there is no value present 179cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @throws NullPointerException if no value is present and 180cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * {@code exceptionSupplier} is null 181cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath */ 182cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath public<X extends Throwable> int orElseThrow(Supplier<X> exceptionSupplier) throws X { 183cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath if (isPresent) { 184cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath return value; 185cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath } else { 186cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath throw exceptionSupplier.get(); 187cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath } 188cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath } 189cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath 190cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath /** 191cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * Indicates whether some other object is "equal to" this OptionalInt. The 192cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * other object is considered equal if: 193cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * <ul> 194cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * <li>it is also an {@code OptionalInt} and; 195cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * <li>both instances have no value present or; 196cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * <li>the present values are "equal to" each other via {@code ==}. 197cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * </ul> 198cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 199cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @param obj an object to be tested for equality 200cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @return {code true} if the other object is "equal to" this object 201cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * otherwise {@code false} 202cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath */ 203cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath @Override 204cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath public boolean equals(Object obj) { 205cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath if (this == obj) { 206cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath return true; 207cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath } 208cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath 209cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath if (!(obj instanceof OptionalInt)) { 210cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath return false; 211cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath } 212cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath 213cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath OptionalInt other = (OptionalInt) obj; 214cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath return (isPresent && other.isPresent) 215cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath ? value == other.value 216cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath : isPresent == other.isPresent; 217cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath } 218cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath 219cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath /** 220cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * Returns the hash code value of the present value, if any, or 0 (zero) if 221cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * no value is present. 222cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 223cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @return hash code value of the present value or 0 if no value is present 224cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath */ 225cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath @Override 226cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath public int hashCode() { 227cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath return isPresent ? Integer.hashCode(value) : 0; 228cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath } 229cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath 230cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath /** 231cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * {@inheritDoc} 232cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 233cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * Returns a non-empty string representation of this object suitable for 234cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * debugging. The exact presentation format is unspecified and may vary 235cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * between implementations and versions. 236cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 237cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @implSpec If a value is present the result must include its string 238cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * representation in the result. Empty and present instances must be 239cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * unambiguously differentiable. 240cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * 241cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath * @return the string representation of this instance 242cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath */ 243cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath @Override 244cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath public String toString() { 245cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath return isPresent 246cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath ? String.format("OptionalInt[%s]", value) 247cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath : "OptionalInt.empty"; 248cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath } 249cd74ab122b3c80d7fd7111105940db13e045f4aaNarayan Kamath} 250