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