--Sample code using standard library or external library for how to return multiple values in Java method (sample code that returns 3 values)
Set a value in an array of Objects and return it. The recipient needs a cast.
public class ArraySample {
  static Object[] getArray() {
    Object[] array = new Object[3];
    array[0] = "foo";
    array[1] = true;
    array[2] = 123456;
    return array;
  }
  public static void main(String[] args) {
    Object[] array = getArray();
    String  foo = (String) array[0];
    boolean bar = (boolean) array[1];
    int     baz = (int) array[2];
    System.out.println(foo);
    System.out.println(bar);
    System.out.println(baz);
  }
}
Set the value to the element of List and return it. The recipient needs a cast.
import java.util.ArrayList;
import java.util.List;
public class ListSample {
  static List<Object> getList() {
    ArrayList<Object> list = new ArrayList<>();
    list.add("foo");
    list.add(true);
    list.add(123456);
    return list;
  }
  public static void main(String[] args) {
    List<Object> list = getList();
    String  foo = (String) list.get(0);
    boolean bar = (boolean) list.get(1);
    int     baz = (int) list.get(2);
    System.out.println(foo);
    System.out.println(bar);
    System.out.println(baz);
  }
}
Set the value to the element of Map and return it. The recipient needs a cast.
import java.util.HashMap;
import java.util.Map;
public class MapSample {
  static Map<String, Object> getMap() {
    HashMap<String, Object> map = new HashMap<>();
    map.put("foo", "foo");
    map.put("bar", true);
    map.put("baz", 123456);
    return map;
  }
  public static void main(String[] args) {
    Map<String, Object> map = getMap();
    String  foo = (String) map.get("foo");
    boolean bar = (boolean) map.get("bar");
    int     baz = (int) map.get("baz");
    System.out.println(foo);
    System.out.println(bar);
    System.out.println(baz);
  }
}
Define a class, set a value in the field and return.
public class ClassSample {
  static class MyClass {
    String foo;
    boolean bar;
    int baz;
  }
  static MyClass getMyClass() {
    MyClass cls = new MyClass();
    cls.foo = "foo";
    cls.bar = true;
    cls.baz = 123456;
    return cls;
  }
  public static void main(String[] args) {
    MyClass cls = getMyClass();
    String  foo = cls.foo;
    boolean bar = cls.bar;
    int     baz = cls.baz;
    System.out.println(foo);
    System.out.println(bar);
    System.out.println(baz);
  }
}
Define a genericized class and specify the type when using it. Set a value in the field and return it.
public class GenericsSample {
  static class ValuesGenerics<T1, T2, T3> {
    T1 foo;
    T2 bar;
    T3 baz;
  }
  static ValuesGenerics<String, Boolean, Integer> getGenerics() {
    ValuesGenerics<String, Boolean, Integer> generics = new ValuesGenerics<>();
    generics.foo = "foo";
    generics.bar = true;
    generics.baz = 123456;
    return generics;
  }
  public static void main(String[] args) {
    ValuesGenerics<String, Boolean, Integer> generics = getGenerics();
    String  foo = generics.foo;
    boolean bar = generics.bar;
    int     baz = generics.baz;
    System.out.println(foo);
    System.out.println(bar);
    System.out.println(baz);
  }
}
Define and use records (scheduled to be officially introduced from Java 16).
public class RecordSample {
  record ValuesRecord(String foo, boolean bar, int baz) {
  }
  static ValuesRecord getRecord() {
    return new ValuesRecord("foo", true, 123456);
  }
  public static void main(String[] args) {
    ValuesRecord record = getRecord();
    String  foo = record.foo;
    boolean bar = record.bar;
    int     baz = record.baz;
    System.out.println(foo);
    System.out.println(bar);
    System.out.println(baz);
  }
}
Reference: JEP 384: Records \ (Second Preview )
Kotlin Standard Library (kotlin.Triple)
Use Kotlin's standard library from Java. Kotlin's standard library includes Pair, which handles two values, and Triple, which handles three values.
import kotlin.Triple;
public class KotlinSample {
  static Triple<String, Boolean, Integer> getTriple() {
    return new Triple<>("foo", true, 123456);
  }
  public static void main(String[] args) {
    Triple<String, Boolean, Integer> triple = getTriple();
    String  foo = triple.getFirst();
    boolean bar = triple.getSecond();
    int     baz = triple.getThird();
    System.out.println(foo);
    System.out.println(bar);
    System.out.println(baz);
  }
}
Reference: Triple -Kotlin Programming Language
Scala Standard Library (scala.Tuple3)
Use Scala's standard library from Java. Scala's standard library ranges from Tuple1 for one value to Tuple22 for 22 values.
import scala.Tuple3;
public class ScalaSample {
  static Tuple3<String, Boolean, Integer> getTuple3() {
    return new Tuple3<>("foo", true, 123456);
  }
  public static void main(String[] args) {
    Tuple3<String, Boolean, Integer> tuple = getTuple3();
    String  foo = tuple._1();
    boolean bar = tuple._2();
    int     baz = tuple._3();
    System.out.println(foo);
    System.out.println(bar);
    System.out.println(baz);
  }
}
Reference: Scala Standard Library 2 \ .13 \ .3 -scala \ .Tuple3
Apache Commons Lang (org.apache.commons.lang3.tuple.Triple)
Apache Commons Lang has a Pair that handles two values and a Triple that handles three values.
import org.apache.commons.lang3.tuple.Triple;
public class ApacheCommonsLangSample {
  static Triple<String, Boolean, Integer> getTriple() {
    return Triple.of("foo", true, 123456);
  }
  public static void main(String[] args) {
    Triple<String, Boolean, Integer> triple = getTriple();
    String  foo = triple.getLeft();
    boolean bar = triple.getMiddle();
    int     baz = triple.getRight();
    System.out.println(foo);
    System.out.println(bar);
    System.out.println(baz);
  }
}
Reference: [Triple \ (Apache Commons Lang 3 \ .11 API )](https://commons.apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/tuple/ Triple.html)
Functional Java (fj.P3)
Functional Java ranges from P1 for one value to P8 for eight values.
import fj.P;
import fj.P3;
public class FunctionalJavaSample {
  static P3<String, Boolean, Integer> getP3() {
    return P.p("foo", true, 123456);
  }
  public static void main(String[] args) {
    P3<String, Boolean, Integer> p = getP3();
    String  foo = p._1();
    boolean bar = p._2();
    int     baz = p._3();
    System.out.println(foo);
    System.out.println(bar);
    System.out.println(baz);
  }
}
Reference: P3 \ (core 4 \ .8 \ .1 API )
javatuples (org.javatuples.Triplet)
javatuples ranges from Units that handle one value to Decades that handle ten values.
import org.javatuples.Triplet;
public class JavatuplesSample {
  static Triplet<String, Boolean, Integer> getTriplet() {
    return Triplet.with("foo", true, 123456);
  }
  public static void main(String[] args) {
    Triplet<String, Boolean, Integer> triplet = getTriplet();
    String  foo = triplet.getValue0();
    boolean bar = triplet.getValue1();
    int     baz = triplet.getValue2();
    System.out.println(foo);
    System.out.println(bar);
    System.out.println(baz);
  }
}
Reference: Triplet \ (javatuples 1 \ .2 API )
jOOλ (org.jooq.lambda.tuple.Tuple3)
jOOλ ranges from Tuple0, which handles 0 values, to Tuple16, which handles 16 values.
import org.jooq.lambda.tuple.Tuple;
import org.jooq.lambda.tuple.Tuple3;
public class JoolSample {
  static Tuple3<String, Boolean, Integer> getTuple3() {
    return Tuple.tuple("foo", true, 123456);
  }
  public static void main(String[] args) {
    Tuple3<String, Boolean, Integer> tuple = getTuple3();
    String  foo = tuple.v1();
    boolean bar = tuple.v2();
    int     baz = tuple.v3();
    System.out.println(foo);
    System.out.println(bar);
    System.out.println(baz);
  }
}
Reference: [Tuple3 \ (jOOL 0 \ .9 \ .14 API )](https://www.jooq.org/products/jOO%ce%bb/javadoc/0.9.14/org/jooq/lambda/tuple /Tuple3.html)
Reactor (reactor.util.function.Tuple3)
Reactors range from Tuple2, which handles two values, to Tuple8, which handles eight values.
import reactor.util.function.Tuple3;
import reactor.util.function.Tuples;
public class ReactorSample {
  static Tuple3<String, Boolean, Integer> getTuple3() {
    return Tuples.of("foo", true, 123456);
  }
  public static void main(String[] args) {
    Tuple3<String, Boolean, Integer> tuple = getTuple3();
    String  foo = tuple.getT1();
    boolean bar = tuple.getT2();
    int     baz = tuple.getT3();
    System.out.println(foo);
    System.out.println(bar);
    System.out.println(baz);
  }
}
Reference: [Tuple3 \ (reactor \ -core 3 \ .3 \ .10 \ .RELEASE )](https://projectreactor.io/docs/core/3.3.10.RELEASE/api/reactor/util/function/ Tuple3.html)
Vavr (io.vavr.Tuple3)
Vavr ranges from Tuple0, which handles 0 values, to Tuple8, which handles 8 values.
import io.vavr.Tuple;
import io.vavr.Tuple3;
public class VavrSample {
  static Tuple3<String, Boolean, Integer> getTuple3() {
    return Tuple.of("foo", true, 123456);
  }
  public static void main(String[] args) {
    Tuple3<String, Boolean, Integer> tuple = getTuple3();
    String  foo = tuple._1();
    boolean bar = tuple._2();
    int     baz = tuple._3();
    System.out.println(foo);
    System.out.println(bar);
    System.out.println(baz);
  }
}
Reference: Tuple3 \ (Vavr 0 \ .10 \ .3 API )
build.gradle
plugins {
  id 'java'
  id 'application'
}
repositories {
  mavenCentral()
}
dependencies {
  //Required libraries
  implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.4.10'
  implementation 'org.scala-lang:scala-library:2.13.3'
  implementation 'org.apache.commons:commons-lang3:3.11'
  implementation 'org.functionaljava:functionaljava:4.8.1'
  implementation 'org.javatuples:javatuples:1.2'
  implementation 'org.jooq:jool:0.9.14'
  implementation 'io.projectreactor:reactor-core:3.3.10.RELEASE'
  implementation 'io.vavr:vavr:0.10.3'
}
sourceCompatibility = JavaVersion.VERSION_15
mainClassName = "App"
tasks.withType(JavaCompile) {
  //Use Java 15 preview feature
  options.compilerArgs += ['--enable-preview']
}
application {
  //Use Java 15 preview feature
  applicationDefaultJvmArgs = ['--enable-preview']
}
public class App {
  public static void main(String[] args) {
    ArraySample.main(args);
    ListSample.main(args);
    MapSample.main(args);
    ClassSample.main(args);
    GenericsSample.main(args);
    RecordSample.main(args);
    KotlinSample.main(args);
    ScalaSample.main(args);
    ApacheCommonsLangSample.main(args);
    FunctionalJavaSample.main(args);
    JavatuplesSample.main(args);
    JoolSample.main(args);
    ReactorSample.main(args);
    VavrSample.main(args);
  }
}
-Note when you want Tuple in Java -Qiita
Recommended Posts