Pertanyaan Apakah .asSet (...) ada di API apa pun?


Saya mencari cara yang sangat sederhana untuk membuat Kumpulan.

Arrays.asList("a", "b" ...) menciptakan a List<String>

Apakah ada yang serupa untuk Set ?


75
2018-05-03 12:20


asal


Jawaban:


Sekarang dengan Java 8 Anda dapat melakukan ini tanpa perlu kerangka pihak ketiga:

Set<String> set = Stream.of("a","b","c").collect(Collectors.toSet());

Lihat Kolektor.

Nikmati!


32
2017-12-23 16:46



Menggunakan Jambu biji, sesederhana itu:

Set<String> mySet = ImmutableSet.<String> of("a", "b");

Atau untuk satu set yang bisa berubah:

Set<String> mySet = Sets.newHashSet("a", "b")

Untuk lebih banyak tipe data, lihat Panduan pengguna Guava


53
2018-05-03 12:24



Anda bisa menggunakannya

new HashSet<String>(Arrays.asList("a","b"));

40
2018-05-03 12:21



Untuk kasus khusus set dengan nol atau satu anggota, Anda dapat menggunakan:

java.util.Collections.EMPTY_SET

dan:

java.util.Collections.singleton("A")

19
2018-01-15 16:20



Seperti yang orang lain katakan, gunakan:

new HashSet<String>(Arrays.asList("a","b"));

Alasannya begini tidak ada di Jawa itu Arrays.asList mengembalikan daftar berukuran tetap, dengan kata lain:

public static void main(String a[])
{
  List<String> myList = Arrays.asList("a", "b");
  myList.add("c");
}

Pengembalian:

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(Unknown Source)
    at java.util.AbstractList.add(Unknown Source)

Tidak ada implementasi JDK dari "ukuran tetap" Set di dalam Arrays kelas. Mengapa kamu menginginkan ini? SEBUAH Set menjamin bahwa tidak ada duplikat, tetapi jika Anda mengetiknya dengan tangan, Anda tidak perlu fungsi itu ... dan List memiliki lebih banyak metode. Kedua antarmuka meluas Collection dan Iterable.


Seperti yang orang lain katakan, gunakan jambu biji Jika Anda benar-benar menginginkan fungsi ini - karena tidak ada dalam JDK. Lihatlah jawaban mereka (terutama jawaban Michael Schmeißer) untuk informasi tentang itu.


14
2018-05-03 12:28



Tidak tetapi Anda dapat melakukannya seperti ini

new HashSet<String>(Arrays.asList("a", "b", ...));

2
2018-05-03 12:22



Di jambu biji Anda bisa menggunakan

Set<String> set = Sets.newHashSet("a","b","c");

newHashSet


2
2018-05-03 12:27



Inilah metode kecil yang bisa Anda gunakan

  /**
   * Utility method analogous to {@link java.util.Arrays#asList(Object[])}
   *
   * @param ts
   * @param <T>
   * @return the set of all the parameters given.
   */
  @SafeVarargs
  @SuppressWarnings("varargs")
  public static <T> Set<T> asSet(T... ts) {
    return new HashSet<>(Arrays.asList(ts));
  }

2
2017-10-03 10:38



Di Java 9, fungsi serupa telah ditambahkan melalui metode pabrik:

Set<String> oneLinerSet = Set.of("a", "b", ...);

(Ada yang setara untuk List demikian juga.)


2
2017-12-29 16:00



Cara lain untuk melakukannya menggunakan Java 8 dan enum adalah:

Set<String> set = EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.READ);

Lihat EnumSet.

Saya akan merekomendasikan analisis kinerja antara pendekatan ini dan

Set<String> set = Stream.of(StandardOpenOption.CREATE, StandardOpenOption.READ).collect(Collectors.toSet());

karena jika Anda memiliki lebih dari lima elemen javadoc dari metode menyatakan bahwa mungkin masalah kinerja seperti yang Anda lihat di javadoc dari Set.Of (E, E ...).


0
2018-06-21 16:20