Tôi đang tìm một cách rất đơn giản để tạo Tập hợp.
Arrays.asList("a", "b" ...)
tạo ra một List<String>
Có điều gì tương tự cho Set
?
Tôi đang tìm một cách rất đơn giản để tạo Tập hợp.
Arrays.asList("a", "b" ...)
tạo ra một List<String>
Có điều gì tương tự cho Set
?
Câu trả lời:
Giờ đây với Java 8, bạn có thể thực hiện việc này mà không cần đến khuôn khổ của bên thứ ba:
Set<String> set = Stream.of("a","b","c").collect(Collectors.toSet());
Xem Người sưu tầm .
Thưởng thức!
Sử dụng Ổi , nó chỉ đơn giản như vậy:
Set<String> mySet = ImmutableSet.<String> of("a", "b");
Hoặc đối với một tập hợp có thể thay đổi:
Set<String> mySet = Sets.newHashSet("a", "b")
Để biết thêm các loại dữ liệu, hãy xem hướng dẫn sử dụng Guava
Sets.newHashSet("a", "b")
hoặcSets.newLinkedHashSet("a", "b")
Sets.newLinkedHashSet()
không tồn tại với chữ ký đó, xin lỗi
Set<String> mySet = ImmutableSet.of("a", "b");
Bạn đã có thể sử dụng
new HashSet<String>(Arrays.asList("a","b"));
Đối với các trường hợp đặc biệt của tập hợp không có hoặc một thành viên, bạn có thể sử dụng:
java.util.Collections.EMPTY_SET
và:
java.util.Collections.singleton("A")
java.util.Collections.emptySet()
theo suy nghĩ của tôi, được ưu tiên hơn EMPTY_SET, do tính an toàn của loại. Từ các nhận xét trong lớp Bộ sưu tập:Unlike the like-named field, this method is parameterized.
Như những người khác đã nói, hãy sử dụng:
new HashSet<String>(Arrays.asList("a","b"));
Lý do điều này không tồn tại trong Java là nó Arrays.asList
trả về một danh sách có kích thước cố định, nói cách khác:
public static void main(String a[])
{
List<String> myList = Arrays.asList("a", "b");
myList.add("c");
}
Lợi nhuận:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(Unknown Source)
at java.util.AbstractList.add(Unknown Source)
Không có triển khai JDK của một "kích thước cố định" Set
bên trong Arrays
lớp. Tại sao bạn muốn điều này? A Set
đảm bảo rằng không có bản sao, nhưng nếu bạn đang gõ chúng bằng tay, bạn không cần chức năng đó ... và List
có nhiều phương pháp hơn. Cả hai giao diện đều mở rộng Collection
và Iterable
.
Như những người khác đã nói, hãy sử dụng ổi Nếu bạn thực sự muốn chức năng này - vì nó không có trong JDK. Hãy xem câu trả lời của họ (cụ thể là câu trả lời của Michael Schmeißer) để biết thông tin về điều đó.
Trong Java 9, chức năng tương tự đã được thêm vào thông qua các phương thức gốc:
Set<String> oneLinerSet = Set.of("a", "b", ...);
(Cũng có những thứ tương đương List
.)
Không nhưng bạn có thể làm như thế này
new HashSet<String>(Arrays.asList("a", "b", ...));
Đây là một phương pháp nhỏ bạn có thể sử dụng
/**
* 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));
}
Một cách khác để làm điều đó bằng cách sử dụng Java 8 và enums sẽ là:
Set<String> set = EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.READ);
Xem EnumSet .
Tôi muốn giới thiệu phân tích hiệu suất giữa phương pháp này và
Set<String> set = Stream.of(StandardOpenOption.CREATE, StandardOpenOption.READ).collect(Collectors.toSet());
bởi vì nếu bạn có nhiều hơn năm phần tử, javadoc của phương thức nói rằng đó có thể là các vấn đề về hiệu suất như bạn có thể thấy trong javadoc của Set.Of (E, E ...) .