diff --git a/benchmark/src/main/java/net/woggioni/jwo/benchmark/Main.java b/benchmark/src/main/java/net/woggioni/jwo/benchmark/Main.java index 8919a51..e42b27a 100644 --- a/benchmark/src/main/java/net/woggioni/jwo/benchmark/Main.java +++ b/benchmark/src/main/java/net/woggioni/jwo/benchmark/Main.java @@ -29,10 +29,10 @@ public class Main { public static void main(String... args) { Map valuesMap = Stream.of( - new Tuple2<>("author", "John Doe"), - new Tuple2<>("date", "2020-03-25 16:22"), - new Tuple2<>("adjective", "simple")) - .collect(CollectionUtils.toUnmodifiableTreeMap(it -> it._1, it -> it._2)); + Tuple2.newInstance("author", "John Doe"), + Tuple2.newInstance("date", "2020-03-25 16:22"), + Tuple2.newInstance("adjective", "simple")) + .collect(CollectionUtils.toUnmodifiableTreeMap(it -> it.get_1(), it -> it.get_2())); withBenchmarkReader( reader -> { Chronometer chronometer = new Chronometer(); diff --git a/src/main/java/net/woggioni/jwo/JWO.java b/src/main/java/net/woggioni/jwo/JWO.java index 75f00ad..d0d4137 100644 --- a/src/main/java/net/woggioni/jwo/JWO.java +++ b/src/main/java/net/woggioni/jwo/JWO.java @@ -391,7 +391,7 @@ public class JWO { return Optional.empty(); } else { return Optional.of( - new Tuple2<>(fileName.substring(0, index), fileName.substring(index))); + Tuple2.newInstance(fileName.substring(0, index), fileName.substring(index))); } } diff --git a/src/main/java/net/woggioni/jwo/LazyValue.java b/src/main/java/net/woggioni/jwo/LazyValue.java new file mode 100644 index 0000000..e92c066 --- /dev/null +++ b/src/main/java/net/woggioni/jwo/LazyValue.java @@ -0,0 +1,23 @@ +package net.woggioni.jwo; + +import java.util.function.Supplier; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class LazyValue { + private final Supplier valueSupplier; + private final MutableTuple2 instance = MutableTuple2.newInstance(null, false); + + public T get() { + if(instance.get_2()) return instance.get_1(); + synchronized (instance) { + if(instance.get_2()) return instance.get_1(); + else { + T value = valueSupplier.get(); + instance.set_1(value); + instance.set_2(true); + return value; + } + } + } +} diff --git a/src/main/java/net/woggioni/jwo/MutableTuple2.java b/src/main/java/net/woggioni/jwo/MutableTuple2.java index 53d4a9f..6ffb0cb 100644 --- a/src/main/java/net/woggioni/jwo/MutableTuple2.java +++ b/src/main/java/net/woggioni/jwo/MutableTuple2.java @@ -1,29 +1,12 @@ package net.woggioni.jwo; -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; +import net.woggioni.jwo.internal.MutableTuple2Impl; -import java.util.Comparator; +public interface MutableTuple2 extends Tuple2 { + void set_1(T value); + void set_2(U value); -@EqualsAndHashCode -@NoArgsConstructor -@AllArgsConstructor -public class MutableTuple2 { - public T _1; - public U _2; - - public static , Y extends Comparable> - Comparator> getComparator(Class cls1, Class cls2) { - return Comparator - .comparing((MutableTuple2 t) -> t._1) - .thenComparing((MutableTuple2 t) -> t._2); - } - - public static , Y extends Comparable> - Comparator> getComparator(MutableTuple2 tuple) { - return Comparator - .comparing((MutableTuple2 t) -> t._1) - .thenComparing((MutableTuple2 t) -> t._2); + static MutableTuple2 newInstance(T x, U y) { + return new MutableTuple2Impl(x, y); } } diff --git a/src/main/java/net/woggioni/jwo/MutableTuple3.java b/src/main/java/net/woggioni/jwo/MutableTuple3.java index 1e44846..988777c 100644 --- a/src/main/java/net/woggioni/jwo/MutableTuple3.java +++ b/src/main/java/net/woggioni/jwo/MutableTuple3.java @@ -1,33 +1,14 @@ package net.woggioni.jwo; -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; +import net.woggioni.jwo.internal.MutableTuple3Impl; -import java.util.Comparator; +public interface MutableTuple3 extends Tuple3 { + void set_1(T value); + void set_2(U value); + void set_3(V value); -@EqualsAndHashCode -@NoArgsConstructor -@AllArgsConstructor -public class MutableTuple3 { - public T _1; - public U _2; - public V _3; - - public static , Y extends Comparable, Z extends Comparable> - Comparator> getComparator(Class cls1, Class cls2, Class cls3) { - return Comparator - .comparing((MutableTuple3 t) -> t._1) - .thenComparing((MutableTuple3 t) -> t._2) - .thenComparing((MutableTuple3 t) -> t._3); - } - - public static , Y extends Comparable, Z extends Comparable> - Comparator> getComparator(MutableTuple3 tuple) { - return Comparator - .comparing((MutableTuple3 t) -> t._1) - .thenComparing((MutableTuple3 t) -> t._2) - .thenComparing((MutableTuple3 t) -> t._3); + static MutableTuple3 newInstance(T x, U y, V z) { + return new MutableTuple3Impl<>(x, y, z); } } diff --git a/src/main/java/net/woggioni/jwo/Tuple2.java b/src/main/java/net/woggioni/jwo/Tuple2.java index e5a951c..196fc71 100644 --- a/src/main/java/net/woggioni/jwo/Tuple2.java +++ b/src/main/java/net/woggioni/jwo/Tuple2.java @@ -1,25 +1,27 @@ package net.woggioni.jwo; -import lombok.EqualsAndHashCode; -import lombok.RequiredArgsConstructor; - import java.util.Comparator; +import java.util.function.Function; +import net.woggioni.jwo.internal.Tuple2Impl; -@EqualsAndHashCode -@RequiredArgsConstructor -public class Tuple2 { - public final T _1; - public final U _2; +public interface Tuple2 { + T get_1(); + U get_2(); - public static , Y extends Comparable> Comparator> getComparator(Class cls1, Class cls2) { - return Comparator - .comparing((Tuple2 t) -> t._1) - .thenComparing((Tuple2 t) -> t._2); + static Tuple2 newInstance(T x, U y) { + return new Tuple2Impl<>(x, y); } - public static , Y extends Comparable> Comparator> getComparator(Tuple2 tuple) { + static , Y extends Comparable> Comparator> getComparator(Class cls1, Class cls2) { return Comparator - .comparing((Tuple2 t) -> t._1) - .thenComparing((Tuple2 t) -> t._2); + .comparing((Function, X>) Tuple2::get_1) + .thenComparing(Tuple2::get_2); + } + + static , Y extends Comparable> Comparator> getComparator(Tuple2 tuple) { + return Comparator + .comparing((Function, X>) Tuple2::get_1) + .thenComparing(Tuple2::get_2); } } + diff --git a/src/main/java/net/woggioni/jwo/Tuple3.java b/src/main/java/net/woggioni/jwo/Tuple3.java index a459563..ebc4889 100644 --- a/src/main/java/net/woggioni/jwo/Tuple3.java +++ b/src/main/java/net/woggioni/jwo/Tuple3.java @@ -1,30 +1,31 @@ package net.woggioni.jwo; -import lombok.EqualsAndHashCode; -import lombok.RequiredArgsConstructor; - import java.util.Comparator; +import net.woggioni.jwo.internal.Tuple3Impl; -@EqualsAndHashCode -@RequiredArgsConstructor -public class Tuple3 { - public final T _1; - public final U _2; - public final V _3; +public interface Tuple3 { + T get_1(); + U get_2(); + V get_3(); - public static , Y extends Comparable, Z extends Comparable> + static Tuple3 newInstance(T x, U y, V z) { + return new Tuple3Impl<>(x, y, z); + } + + static , Y extends Comparable, Z extends Comparable> Comparator> getComparator(Class cls1, Class cls2, Class cls3) { return Comparator - .comparing((Tuple3 t) -> t._1) - .thenComparing((Tuple3 t) -> t._2) - .thenComparing((Tuple3 t) -> t._3); + .comparing((Tuple3 t) -> t.get_1()) + .thenComparing((Tuple3 t) -> t.get_2()) + .thenComparing((Tuple3 t) -> t.get_3()); } - public static , Y extends Comparable, Z extends Comparable> + static , Y extends Comparable, Z extends Comparable> Comparator> getComparator(Tuple3 tuple) { return Comparator - .comparing((Tuple3 t) -> t._1) - .thenComparing((Tuple3 t) -> t._2) - .thenComparing((Tuple3 t) -> t._3); + .comparing((Tuple3 t) -> t.get_1()) + .thenComparing((Tuple3 t) -> t.get_2()) + .thenComparing((Tuple3 t) -> t.get_3()); } } + diff --git a/src/main/java/net/woggioni/jwo/internal/MutableTuple2Impl.java b/src/main/java/net/woggioni/jwo/internal/MutableTuple2Impl.java new file mode 100644 index 0000000..a63cbb6 --- /dev/null +++ b/src/main/java/net/woggioni/jwo/internal/MutableTuple2Impl.java @@ -0,0 +1,23 @@ +package net.woggioni.jwo.internal; + +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import net.woggioni.jwo.MutableTuple2; + +@EqualsAndHashCode +@NoArgsConstructor +@AllArgsConstructor +public class MutableTuple2Impl implements MutableTuple2 { + @Getter + @Setter + private T _1; + + + + @Getter + @Setter + private U _2; +} \ No newline at end of file diff --git a/src/main/java/net/woggioni/jwo/internal/MutableTuple3Impl.java b/src/main/java/net/woggioni/jwo/internal/MutableTuple3Impl.java new file mode 100644 index 0000000..29b11fc --- /dev/null +++ b/src/main/java/net/woggioni/jwo/internal/MutableTuple3Impl.java @@ -0,0 +1,25 @@ +package net.woggioni.jwo.internal; + +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import net.woggioni.jwo.MutableTuple3; + +@EqualsAndHashCode +@NoArgsConstructor +@AllArgsConstructor +public class MutableTuple3Impl implements MutableTuple3 { + @Getter + @Setter + private T _1; + + @Getter + @Setter + private U _2; + + @Getter + @Setter + private V _3; +} \ No newline at end of file diff --git a/src/main/java/net/woggioni/jwo/internal/Tuple2Impl.java b/src/main/java/net/woggioni/jwo/internal/Tuple2Impl.java new file mode 100644 index 0000000..778c7f1 --- /dev/null +++ b/src/main/java/net/woggioni/jwo/internal/Tuple2Impl.java @@ -0,0 +1,17 @@ +package net.woggioni.jwo.internal; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import net.woggioni.jwo.Tuple2; + +@EqualsAndHashCode +@RequiredArgsConstructor +public class Tuple2Impl implements Tuple2 { + @Getter + private final T _1; + + @Getter + private final U _2; +} + diff --git a/src/main/java/net/woggioni/jwo/internal/Tuple3Impl.java b/src/main/java/net/woggioni/jwo/internal/Tuple3Impl.java new file mode 100644 index 0000000..739965f --- /dev/null +++ b/src/main/java/net/woggioni/jwo/internal/Tuple3Impl.java @@ -0,0 +1,11 @@ +package net.woggioni.jwo.internal; + +import lombok.Data; +import net.woggioni.jwo.Tuple3; + +@Data +public class Tuple3Impl implements Tuple3 { + private final T _1; + private final U _2; + private final V _3; +} diff --git a/src/test/java/net/woggioni/jwo/TreeWalkerTest.java b/src/test/java/net/woggioni/jwo/TreeWalkerTest.java index 1c44f9a..294b78c 100644 --- a/src/test/java/net/woggioni/jwo/TreeWalkerTest.java +++ b/src/test/java/net/woggioni/jwo/TreeWalkerTest.java @@ -27,14 +27,14 @@ public class TreeWalkerTest { private Map> parentChildRelationshipMap = Stream.of( - new Tuple2<>(1, Collections.singletonList(2)), - new Tuple2<>(2, Collections.singletonList(3)), - new Tuple2<>(3, Arrays.asList(4, 5)), - new Tuple2<>(4, Arrays.asList(6, 7)), - new Tuple2<>(5, Collections.singletonList(8)) - ).collect(Collectors.toMap(t -> t._1, t -> t._2)); + Tuple2.newInstance(1, Collections.singletonList(2)), + Tuple2.newInstance(2, Collections.singletonList(3)), + Tuple2.newInstance(3, Arrays.asList(4, 5)), + Tuple2.newInstance(4, Arrays.asList(6, 7)), + Tuple2.newInstance(5, Collections.singletonList(8)) + ).collect(Collectors.toMap(Tuple2::get_1, Tuple2::get_2)); - private Map testNodeMap = parentChildRelationshipMap.entrySet().stream() + private final Map testNodeMap = parentChildRelationshipMap.entrySet().stream() .map(entry -> newNode(entry.getKey(), entry.getValue())) .collect(Collectors.toMap(Node::getId, Function.identity()));