/*
 * Copyright (c) 2011-2017 Pivotal Software Inc, All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package reactor.util.function;

import java.util.Collection;
import java.util.function.Function;

A Tuples is an immutable Collection of objects, each of which can be of an arbitrary type.
Author:Jon Brisbin, Stephane Maldini
/** * A {@literal Tuples} is an immutable {@link Collection} of objects, each of which can be of an arbitrary type. * * @author Jon Brisbin * @author Stephane Maldini */
@SuppressWarnings({"rawtypes"}) public abstract class Tuples implements Function {
Create a Tuple2 with the given array if it is small enough to fit inside a Tuple2 to Tuple8.
Params:
  • list – the content of the Tuple (size 1 to 8)
Throws:
Returns:The new Tuple2.
/** * Create a {@link Tuple2} with the given array if it is small * enough to fit inside a {@link Tuple2} to {@link Tuple8}. * * @param list the content of the Tuple (size 1 to 8) * @return The new {@link Tuple2}. * @throws IllegalArgumentException if the array is not of length 1-8 */
public static Tuple2 fromArray(Object[] list) { //noinspection ConstantConditions if (list == null || list.length < 2) { throw new IllegalArgumentException("null or too small array, need between 2 and 8 values"); } switch (list.length){ case 2: return of(list[0], list[1]); case 3: return of(list[0], list[1], list[2]); case 4: return of(list[0], list[1], list[2], list[3]); case 5: return of(list[0], list[1], list[2], list[3], list[4]); case 6: return of(list[0], list[1], list[2], list[3], list[4], list[5]); case 7: return of(list[0], list[1], list[2], list[3], list[4], list[5], list[6]); case 8: return of(list[0], list[1], list[2], list[3], list[4], list[5], list[6], list[7]); } throw new IllegalArgumentException("too many arguments ("+ list.length + "), need between 2 and 8 values"); }
Create a Tuple2 with the given objects.
Params:
  • t1 – The first value in the tuple. Not null.
  • t2 – The second value in the tuple. Not null.
Type parameters:
  • <T1> – The type of the first value.
  • <T2> – The type of the second value.
Returns:The new Tuple2.
/** * Create a {@link Tuple2} with the given objects. * * @param t1 The first value in the tuple. Not null. * @param t2 The second value in the tuple. Not null. * @param <T1> The type of the first value. * @param <T2> The type of the second value. * @return The new {@link Tuple2}. */
public static <T1, T2> Tuple2<T1, T2> of(T1 t1, T2 t2) { return new Tuple2<>(t1, t2); }
Create a Tuple3 with the given objects.
Params:
  • t1 – The first value in the tuple. Not null.
  • t2 – The second value in the tuple. Not null.
  • t3 – The third value in the tuple. Not null.
Type parameters:
  • <T1> – The type of the first value.
  • <T2> – The type of the second value.
  • <T3> – The type of the third value.
Returns:The new Tuple3.
/** * Create a {@link Tuple3} with the given objects. * * @param t1 The first value in the tuple. Not null. * @param t2 The second value in the tuple. Not null. * @param t3 The third value in the tuple. Not null. * @param <T1> The type of the first value. * @param <T2> The type of the second value. * @param <T3> The type of the third value. * @return The new {@link Tuple3}. */
public static <T1, T2, T3> Tuple3<T1, T2, T3> of(T1 t1, T2 t2, T3 t3) { return new Tuple3<>(t1, t2, t3); }
Create a Tuple4 with the given objects.
Params:
  • t1 – The first value in the tuple. Not null.
  • t2 – The second value in the tuple. Not null.
  • t3 – The third value in the tuple. Not null.
  • t4 – The fourth value in the tuple. Not null.
Type parameters:
  • <T1> – The type of the first value.
  • <T2> – The type of the second value.
  • <T3> – The type of the third value.
  • <T4> – The type of the fourth value.
Returns:The new Tuple4.
/** * Create a {@link Tuple4} with the given objects. * * @param t1 The first value in the tuple. Not null. * @param t2 The second value in the tuple. Not null. * @param t3 The third value in the tuple. Not null. * @param t4 The fourth value in the tuple. Not null. * @param <T1> The type of the first value. * @param <T2> The type of the second value. * @param <T3> The type of the third value. * @param <T4> The type of the fourth value. * @return The new {@link Tuple4}. */
public static <T1, T2, T3, T4> Tuple4<T1, T2, T3, T4> of(T1 t1, T2 t2, T3 t3, T4 t4) { return new Tuple4<>(t1, t2, t3, t4); }
Create a Tuple5 with the given objects.
Params:
  • t1 – The first value in the tuple. Not null.
  • t2 – The second value in the tuple. Not null.
  • t3 – The third value in the tuple. Not null.
  • t4 – The fourth value in the tuple. Not null.
  • t5 – The fifth value in the tuple. Not null.
Type parameters:
  • <T1> – The type of the first value.
  • <T2> – The type of the second value.
  • <T3> – The type of the third value.
  • <T4> – The type of the fourth value.
  • <T5> – The type of the fifth value.
Returns:The new Tuple5.
/** * Create a {@link Tuple5} with the given objects. * * @param t1 The first value in the tuple. Not null. * @param t2 The second value in the tuple. Not null. * @param t3 The third value in the tuple. Not null. * @param t4 The fourth value in the tuple. Not null. * @param t5 The fifth value in the tuple. Not null. * @param <T1> The type of the first value. * @param <T2> The type of the second value. * @param <T3> The type of the third value. * @param <T4> The type of the fourth value. * @param <T5> The type of the fifth value. * @return The new {@link Tuple5}. */
public static <T1, T2, T3, T4, T5> Tuple5<T1, T2, T3, T4, T5> of( T1 t1, T2 t2, T3 t3, T4 t4, T5 t5) { return new Tuple5<>(t1, t2, t3, t4, t5); }
Create a Tuple6 with the given objects.
Params:
  • t1 – The first value in the tuple. Not null.
  • t2 – The second value in the tuple. Not null.
  • t3 – The third value in the tuple. Not null.
  • t4 – The fourth value in the tuple. Not null.
  • t5 – The fifth value in the tuple. Not null.
  • t6 – The sixth value in the tuple. Not null.
Type parameters:
  • <T1> – The type of the first value.
  • <T2> – The type of the second value.
  • <T3> – The type of the third value.
  • <T4> – The type of the fourth value.
  • <T5> – The type of the fifth value.
  • <T6> – The type of the sixth value.
Returns:The new Tuple6.
/** * Create a {@link Tuple6} with the given objects. * * @param t1 The first value in the tuple. Not null. * @param t2 The second value in the tuple. Not null. * @param t3 The third value in the tuple. Not null. * @param t4 The fourth value in the tuple. Not null. * @param t5 The fifth value in the tuple. Not null. * @param t6 The sixth value in the tuple. Not null. * @param <T1> The type of the first value. * @param <T2> The type of the second value. * @param <T3> The type of the third value. * @param <T4> The type of the fourth value. * @param <T5> The type of the fifth value. * @param <T6> The type of the sixth value. * @return The new {@link Tuple6}. */
public static <T1, T2, T3, T4, T5, T6> Tuple6<T1, T2, T3, T4, T5, T6> of( T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6) { return new Tuple6<>(t1, t2, t3, t4, t5, t6); }
Create a Tuple7 with the given objects.
Params:
  • t1 – The first value in the tuple. Not null.
  • t2 – The second value in the tuple. Not null.
  • t3 – The third value in the tuple. Not null.
  • t4 – The fourth value in the tuple. Not null.
  • t5 – The fifth value in the tuple. Not null.
  • t6 – The sixth value in the tuple. Not null.
  • t7 – The seventh value in the tuple. Not null.
Type parameters:
  • <T1> – The type of the first value.
  • <T2> – The type of the second value.
  • <T3> – The type of the third value.
  • <T4> – The type of the fourth value.
  • <T5> – The type of the fifth value.
  • <T6> – The type of the sixth value.
  • <T7> – The type of the seventh value.
Returns:The new Tuple7.
/** * Create a {@link Tuple7} with the given objects. * * @param t1 The first value in the tuple. Not null. * @param t2 The second value in the tuple. Not null. * @param t3 The third value in the tuple. Not null. * @param t4 The fourth value in the tuple. Not null. * @param t5 The fifth value in the tuple. Not null. * @param t6 The sixth value in the tuple. Not null. * @param t7 The seventh value in the tuple. Not null. * @param <T1> The type of the first value. * @param <T2> The type of the second value. * @param <T3> The type of the third value. * @param <T4> The type of the fourth value. * @param <T5> The type of the fifth value. * @param <T6> The type of the sixth value. * @param <T7> The type of the seventh value. * @return The new {@link Tuple7}. */
public static <T1, T2, T3, T4, T5, T6, T7> Tuple7<T1, T2, T3, T4, T5, T6, T7> of( T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7) { return new Tuple7<>(t1, t2, t3, t4, t5, t6, t7); }
Create a Tuple8 with the given objects.
Params:
  • t1 – The first value in the tuple. Not Null.
  • t2 – The second value in the tuple.Not Null.
  • t3 – The third value in the tuple. Not Null.
  • t4 – The fourth value in the tuple. Not Null.
  • t5 – The fifth value in the tuple. Not Null.
  • t6 – The sixth value in the tuple. Not Null.
  • t7 – The seventh value in the tuple. Not Null.
  • t8 – The eighth value in the tuple. Not Null.
Type parameters:
  • <T1> – The type of the first value.
  • <T2> – The type of the second value.
  • <T3> – The type of the third value.
  • <T4> – The type of the fourth value.
  • <T5> – The type of the fifth value.
  • <T6> – The type of the sixth value.
  • <T7> – The type of the seventh value.
  • <T8> – The type of the eighth value.
Returns:The new Tuple8.
/** * Create a {@link Tuple8} with the given objects. * * @param t1 The first value in the tuple. Not Null. * @param t2 The second value in the tuple.Not Null. * @param t3 The third value in the tuple. Not Null. * @param t4 The fourth value in the tuple. Not Null. * @param t5 The fifth value in the tuple. Not Null. * @param t6 The sixth value in the tuple. Not Null. * @param t7 The seventh value in the tuple. Not Null. * @param t8 The eighth value in the tuple. Not Null. * @param <T1> The type of the first value. * @param <T2> The type of the second value. * @param <T3> The type of the third value. * @param <T4> The type of the fourth value. * @param <T5> The type of the fifth value. * @param <T6> The type of the sixth value. * @param <T7> The type of the seventh value. * @param <T8> The type of the eighth value. * @return The new {@link Tuple8}. */
public static <T1, T2, T3, T4, T5, T6, T7, T8> Tuple8<T1, T2, T3, T4, T5, T6, T7, T8> of( T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8) { return new Tuple8<>(t1, t2, t3, t4, t5, t6, t7, t8); }
A converting function from Object array to Tuples
Returns:The unchecked conversion function to Tuples.
/** * A converting function from Object array to {@link Tuples} * * @return The unchecked conversion function to {@link Tuples}. */
@SuppressWarnings("unchecked") public static Function<Object[], Tuple2> fnAny() { return empty; }
A converting function from Object array to Tuples to R.
Params:
  • delegate – the function to delegate to
Type parameters:
  • <R> – The type of the return value.
Returns:The unchecked conversion function to R.
/** * A converting function from Object array to {@link Tuples} to R. * * @param <R> The type of the return value. * @param delegate the function to delegate to * * @return The unchecked conversion function to R. */
public static <R> Function<Object[], R> fnAny(final Function<Tuple2, R> delegate) { return objects -> delegate.apply(Tuples.fnAny().apply(objects)); }
A converting function from Object array to Tuple2
Type parameters:
  • <T1> – The type of the first value.
  • <T2> – The type of the second value.
Returns:The unchecked conversion function to Tuple2.
/** * A converting function from Object array to {@link Tuple2} * * @param <T1> The type of the first value. * @param <T2> The type of the second value. * * @return The unchecked conversion function to {@link Tuple2}. */
@SuppressWarnings("unchecked") public static <T1, T2> Function<Object[], Tuple2<T1, T2>> fn2() { return empty; }
A converting function from Object array to Tuple3
Type parameters:
  • <T1> – The type of the first value.
  • <T2> – The type of the second value.
  • <T3> – The type of the third value.
Returns:The unchecked conversion function to Tuple3.
/** * A converting function from Object array to {@link Tuple3} * * @param <T1> The type of the first value. * @param <T2> The type of the second value. * @param <T3> The type of the third value. * * @return The unchecked conversion function to {@link Tuple3}. */
@SuppressWarnings("unchecked") public static <T1, T2, T3> Function<Object[], Tuple3<T1, T2, T3>> fn3() { return empty; }
A converting function from Object array to Tuple3 to R.
Params:
  • delegate – the function to delegate to
Type parameters:
  • <T1> – The type of the first value.
  • <T2> – The type of the second value.
  • <T3> – The type of the third value.
  • <R> – The type of the return value.
Returns:The unchecked conversion function to R.
/** * A converting function from Object array to {@link Tuple3} to R. * * @param <T1> The type of the first value. * @param <T2> The type of the second value. * @param <T3> The type of the third value. * @param <R> The type of the return value. * @param delegate the function to delegate to * * @return The unchecked conversion function to R. */
public static <T1, T2, T3, R> Function<Object[], R> fn3(final Function<Tuple3<T1, T2, T3>, R> delegate) { return objects -> delegate.apply(Tuples.<T1, T2, T3>fn3().apply(objects)); }
A converting function from Object array to Tuple4
Type parameters:
  • <T1> – The type of the first value.
  • <T2> – The type of the second value.
  • <T3> – The type of the third value.
  • <T4> – The type of the fourth value.
Returns:The unchecked conversion function to Tuple4.
/** * A converting function from Object array to {@link Tuple4} * * @param <T1> The type of the first value. * @param <T2> The type of the second value. * @param <T3> The type of the third value. * @param <T4> The type of the fourth value. * * @return The unchecked conversion function to {@link Tuple4}. */
@SuppressWarnings("unchecked") public static <T1, T2, T3, T4> Function<Object[], Tuple4<T1, T2, T3, T4>> fn4() { return empty; }
A converting function from Object array to Tuple4 to R.
Params:
  • delegate – the function to delegate to
Type parameters:
  • <T1> – The type of the first value.
  • <T2> – The type of the second value.
  • <T3> – The type of the third value.
  • <T4> – The type of the fourth value.
  • <R> – The type of the return value.
Returns:The unchecked conversion function to R.
/** * A converting function from Object array to {@link Tuple4} to R. * * @param <T1> The type of the first value. * @param <T2> The type of the second value. * @param <T3> The type of the third value. * @param <T4> The type of the fourth value. * @param <R> The type of the return value. * @param delegate the function to delegate to * * @return The unchecked conversion function to R. */
public static <T1, T2, T3, T4, R> Function<Object[], R> fn4(final Function<Tuple4<T1, T2, T3, T4>, R> delegate) { return objects -> delegate.apply(Tuples.<T1, T2, T3, T4>fn4().apply(objects)); }
A converting function from Object array to Tuple5
Type parameters:
  • <T1> – The type of the first value.
  • <T2> – The type of the second value.
  • <T3> – The type of the third value.
  • <T4> – The type of the fourth value.
  • <T5> – The type of the fifth value.
Returns:The unchecked conversion function to Tuple5.
/** * A converting function from Object array to {@link Tuple5} * * @param <T1> The type of the first value. * @param <T2> The type of the second value. * @param <T3> The type of the third value. * @param <T4> The type of the fourth value. * @param <T5> The type of the fifth value. * * @return The unchecked conversion function to {@link Tuple5}. */
@SuppressWarnings("unchecked") public static <T1, T2, T3, T4, T5> Function<Object[], Tuple5<T1, T2, T3, T4, T5>> fn5() { return empty; }
A converting function from Object array to Tuple4 to R.
Params:
  • delegate – the function to delegate to
Type parameters:
  • <T1> – The type of the first value.
  • <T2> – The type of the second value.
  • <T3> – The type of the third value.
  • <T4> – The type of the fourth value.
  • <T5> – The type of the fifth value.
  • <R> – The type of the return value.
Returns:The unchecked conversion function to R.
/** * A converting function from Object array to {@link Tuple4} to R. * * @param <T1> The type of the first value. * @param <T2> The type of the second value. * @param <T3> The type of the third value. * @param <T4> The type of the fourth value. * @param <T5> The type of the fifth value. * @param <R> The type of the return value. * @param delegate the function to delegate to * * @return The unchecked conversion function to R. */
public static <T1, T2, T3, T4, T5, R> Function<Object[], R> fn5(final Function<Tuple5<T1, T2, T3, T4, T5>, R> delegate) { return objects -> delegate.apply(Tuples.<T1, T2, T3, T4, T5>fn5().apply(objects)); }
A converting function from Object array to Tuple6
Type parameters:
  • <T1> – The type of the first value.
  • <T2> – The type of the second value.
  • <T3> – The type of the third value.
  • <T4> – The type of the fourth value.
  • <T5> – The type of the fifth value.
  • <T6> – The type of the sixth value.
Returns:The unchecked conversion function to Tuple6.
/** * A converting function from Object array to {@link Tuple6} * * @param <T1> The type of the first value. * @param <T2> The type of the second value. * @param <T3> The type of the third value. * @param <T4> The type of the fourth value. * @param <T5> The type of the fifth value. * @param <T6> The type of the sixth value. * * @return The unchecked conversion function to {@link Tuple6}. */
@SuppressWarnings("unchecked") public static <T1, T2, T3, T4, T5, T6> Function<Object[], Tuple6<T1, T2, T3, T4, T5, T6>> fn6() { return empty; }
A converting function from Object array to Tuple6 to R.
Params:
  • delegate – the function to delegate to
Type parameters:
  • <T1> – The type of the first value.
  • <T2> – The type of the second value.
  • <T3> – The type of the third value.
  • <T4> – The type of the fourth value.
  • <T5> – The type of the fifth value.
  • <T6> – The type of the sixth value.
  • <R> – The type of the return value.
Returns:The unchecked conversion function to R.
/** * A converting function from Object array to {@link Tuple6} to R. * * @param <T1> The type of the first value. * @param <T2> The type of the second value. * @param <T3> The type of the third value. * @param <T4> The type of the fourth value. * @param <T5> The type of the fifth value. * @param <T6> The type of the sixth value. * @param <R> The type of the return value. * @param delegate the function to delegate to * * @return The unchecked conversion function to R. */
public static <T1, T2, T3, T4, T5, T6, R> Function<Object[], R> fn6(final Function<Tuple6<T1, T2, T3, T4, T5, T6>, R> delegate) { return objects -> delegate.apply(Tuples.<T1, T2, T3, T4, T5, T6>fn6().apply(objects)); }
A converting function from Object array to Tuple7
Type parameters:
  • <T1> – The type of the first value.
  • <T2> – The type of the second value.
  • <T3> – The type of the third value.
  • <T4> – The type of the fourth value.
  • <T5> – The type of the fifth value.
  • <T6> – The type of the sixth value.
  • <T7> – The type of the seventh value.
Returns:The unchecked conversion function to Tuple7.
/** * A converting function from Object array to {@link Tuple7} * * @param <T1> The type of the first value. * @param <T2> The type of the second value. * @param <T3> The type of the third value. * @param <T4> The type of the fourth value. * @param <T5> The type of the fifth value. * @param <T6> The type of the sixth value. * @param <T7> The type of the seventh value. * * @return The unchecked conversion function to {@link Tuple7}. */
@SuppressWarnings("unchecked") public static <T1, T2, T3, T4, T5, T6, T7> Function<Object[], Tuple7<T1, T2, T3, T4, T5, T6, T7>> fn7() { return empty; }
A converting function from Object array to Tuple7 to R.
Params:
  • delegate – the function to delegate to
Type parameters:
  • <T1> – The type of the first value.
  • <T2> – The type of the second value.
  • <T3> – The type of the third value.
  • <T4> – The type of the fourth value.
  • <T5> – The type of the fifth value.
  • <T6> – The type of the sixth value.
  • <T7> – The type of the seventh value.
  • <R> – The type of the return value.
Returns:The unchecked conversion function to R.
/** * A converting function from Object array to {@link Tuple7} to R. * * @param <T1> The type of the first value. * @param <T2> The type of the second value. * @param <T3> The type of the third value. * @param <T4> The type of the fourth value. * @param <T5> The type of the fifth value. * @param <T6> The type of the sixth value. * @param <T7> The type of the seventh value. * @param <R> The type of the return value. * @param delegate the function to delegate to * * @return The unchecked conversion function to R. */
public static <T1, T2, T3, T4, T5, T6, T7, R> Function<Object[], R> fn7(final Function<Tuple7<T1, T2, T3, T4, T5, T6, T7>, R> delegate) { return objects -> delegate.apply(Tuples.<T1, T2, T3, T4, T5, T6, T7>fn7().apply(objects)); }
A converting function from Object array to Tuple8
Type parameters:
  • <T1> – The type of the first value.
  • <T2> – The type of the second value.
  • <T3> – The type of the third value.
  • <T4> – The type of the fourth value.
  • <T5> – The type of the fifth value.
  • <T6> – The type of the sixth value.
  • <T7> – The type of the seventh value.
  • <T8> – The type of the eighth value.
Returns:The unchecked conversion function to Tuple8.
/** * A converting function from Object array to {@link Tuple8} * * @param <T1> The type of the first value. * @param <T2> The type of the second value. * @param <T3> The type of the third value. * @param <T4> The type of the fourth value. * @param <T5> The type of the fifth value. * @param <T6> The type of the sixth value. * @param <T7> The type of the seventh value. * @param <T8> The type of the eighth value. * * @return The unchecked conversion function to {@link Tuple8}. */
@SuppressWarnings("unchecked") public static <T1, T2, T3, T4, T5, T6, T7, T8> Function<Object[], Tuple8<T1, T2, T3, T4, T5, T6, T7, T8>> fn8() { return empty; }
A converting function from Object array to Tuple8
Params:
  • delegate – the function to delegate to
Type parameters:
  • <T1> – The type of the first value.
  • <T2> – The type of the second value.
  • <T3> – The type of the third value.
  • <T4> – The type of the fourth value.
  • <T5> – The type of the fifth value.
  • <T6> – The type of the sixth value.
  • <T7> – The type of the seventh value.
  • <T8> – The type of the eighth value.
  • <R> – The type of the return value.
Returns:The unchecked conversion function to Tuple8.
/** * A converting function from Object array to {@link Tuple8} * * @param <T1> The type of the first value. * @param <T2> The type of the second value. * @param <T3> The type of the third value. * @param <T4> The type of the fourth value. * @param <T5> The type of the fifth value. * @param <T6> The type of the sixth value. * @param <T7> The type of the seventh value. * @param <T8> The type of the eighth value. * @param <R> The type of the return value. * @param delegate the function to delegate to * * @return The unchecked conversion function to {@link Tuple8}. */
public static <T1, T2, T3, T4, T5, T6, T7, T8, R> Function<Object[], R> fn8(final Function<Tuple8<T1, T2, T3, T4, T5, T6, T7, T8>, R> delegate) { return objects -> delegate.apply(Tuples.<T1, T2, T3, T4, T5, T6, T7, T8>fn8().apply(objects)); } @Override public Tuple2 apply(Object o) { return fromArray((Object[])o); }
Prepare a string representation of the values suitable for a Tuple of any size by accepting an array of elements. This builds a StringBuilder containing the String representation of each object, comma separated. It manages nulls as well by putting an empty string and the comma.
Params:
  • values – the values of the tuple to represent
Returns:a StringBuilder initialized with the string representation of the values in the Tuple.
/** * Prepare a string representation of the values suitable for a Tuple of any * size by accepting an array of elements. This builds a {@link StringBuilder} * containing the String representation of each object, comma separated. It manages * nulls as well by putting an empty string and the comma. * * @param values the values of the tuple to represent * @return a {@link StringBuilder} initialized with the string representation of the * values in the Tuple. */
static StringBuilder tupleStringRepresentation(Object... values) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < values.length; i++) { Object t = values[i]; if (i != 0) { sb.append(','); } if (t != null) { sb.append(t); } } return sb; } static final Tuples empty = new Tuples(){}; Tuples(){} }