Add missing Optional methods and fix bug in equals (#533)

This commit is contained in:
Ivan Hetman 2020-10-26 12:04:26 +02:00 committed by GitHub
parent dfef5ffd24
commit baeb2a28a7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 115 additions and 6 deletions

View File

@ -15,6 +15,7 @@
*/
package org.teavm.classlib.java.util;
import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Function;
@ -90,6 +91,15 @@ public final class TOptional<T> {
return value != null ? mapper.apply(value) : (TOptional<U>) this;
}
@SuppressWarnings("unchecked")
public TOptional<T> or(Supplier<? extends TOptional<? extends T>> supplier) {
if (value != null) {
return this;
} else {
return Objects.requireNonNull((TOptional<T>) supplier.get());
}
}
public T orElse(T other) {
return value != null ? value : other;
}
@ -98,6 +108,14 @@ public final class TOptional<T> {
return value != null ? value : other.get();
}
public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction) {
if (value != null) {
action.accept(value);
} else {
emptyAction.run();
}
}
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value == null) {
throw exceptionSupplier.get();
@ -105,6 +123,13 @@ public final class TOptional<T> {
return value;
}
public T orElseThrow() {
if (value == null) {
throw new NoSuchElementException();
}
return value;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {

View File

@ -19,6 +19,7 @@ import java.util.NoSuchElementException;
import java.util.function.DoubleConsumer;
import java.util.function.DoubleSupplier;
import java.util.function.Supplier;
import org.teavm.classlib.java.util.stream.TDoubleStream;
public class TOptionalDouble {
private static TOptionalDouble emptyInstance;
@ -51,6 +52,10 @@ public class TOptionalDouble {
return this != emptyInstance;
}
public boolean isEmpty() {
return this == emptyInstance;
}
public void ifPresent(DoubleConsumer consumer) {
if (this != emptyInstance) {
consumer.accept(value);
@ -65,19 +70,42 @@ public class TOptionalDouble {
return this != emptyInstance ? value : other.getAsDouble();
}
public void ifPresentOrElse(DoubleConsumer action, Runnable emptyAction) {
if (this == emptyInstance) {
emptyAction.run();
} else {
action.accept(value);
}
}
public <X extends Throwable> double orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (!isPresent()) {
if (this == emptyInstance) {
throw exceptionSupplier.get();
}
return value;
}
public double orElseThrow() {
if (this == emptyInstance) {
throw new NoSuchElementException();
}
return value;
}
public TDoubleStream stream() {
if (this == emptyInstance) {
return TDoubleStream.empty();
} else {
return TDoubleStream.of(value);
}
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof TOptionalDouble)) {
if (this == emptyInstance || obj == emptyInstance || !(obj instanceof TOptionalDouble)) {
return false;
}

View File

@ -19,6 +19,7 @@ import java.util.NoSuchElementException;
import java.util.function.IntConsumer;
import java.util.function.IntSupplier;
import java.util.function.Supplier;
import org.teavm.classlib.java.util.stream.TIntStream;
public class TOptionalInt {
private static TOptionalInt emptyInstance;
@ -51,6 +52,10 @@ public class TOptionalInt {
return this != emptyInstance;
}
public boolean isEmpty() {
return this == emptyInstance;
}
public void ifPresent(IntConsumer consumer) {
if (this != emptyInstance) {
consumer.accept(value);
@ -65,19 +70,42 @@ public class TOptionalInt {
return this != emptyInstance ? value : other.getAsInt();
}
public void ifPresentOrElse(IntConsumer action, Runnable emptyAction) {
if (this == emptyInstance) {
emptyAction.run();
} else {
action.accept(value);
}
}
public <X extends Throwable> int orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (!isPresent()) {
if (this == emptyInstance) {
throw exceptionSupplier.get();
}
return value;
}
public int orElseThrow() {
if (this == emptyInstance) {
throw new NoSuchElementException();
}
return value;
}
public TIntStream stream() {
if (this == emptyInstance) {
return TIntStream.empty();
} else {
return TIntStream.of(value);
}
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof TOptionalInt)) {
if (this == emptyInstance || obj == emptyInstance || !(obj instanceof TOptionalInt)) {
return false;
}

View File

@ -19,6 +19,7 @@ import java.util.NoSuchElementException;
import java.util.function.LongConsumer;
import java.util.function.LongSupplier;
import java.util.function.Supplier;
import org.teavm.classlib.java.util.stream.TLongStream;
public class TOptionalLong {
private static TOptionalLong emptyInstance;
@ -51,6 +52,10 @@ public class TOptionalLong {
return this != emptyInstance;
}
public boolean isEmpty() {
return this == emptyInstance;
}
public void ifPresent(LongConsumer consumer) {
if (this != emptyInstance) {
consumer.accept(value);
@ -65,19 +70,42 @@ public class TOptionalLong {
return this != emptyInstance ? value : other.getAsLong();
}
public void ifPresentOrElse(LongConsumer action, Runnable emptyAction) {
if (this == emptyInstance) {
emptyAction.run();
} else {
action.accept(value);
}
}
public <X extends Throwable> long orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (!isPresent()) {
if (this == emptyInstance) {
throw exceptionSupplier.get();
}
return value;
}
public long orElseThrow() {
if (this == emptyInstance) {
throw new NoSuchElementException();
}
return value;
}
public TLongStream stream() {
if (this == emptyInstance) {
return TLongStream.empty();
} else {
return TLongStream.of(value);
}
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof TOptionalLong)) {
if (this == emptyInstance || obj == emptyInstance || !(obj instanceof TOptionalLong)) {
return false;
}