พิจารณาว่าเรามี Set<String> stringSet
เราสามารถใช้ต่อไปนี้:
Java 10 (รายการที่แก้ไขไม่ได้)
List<String> strList = stringSet.stream().collect(Collectors.toUnmodifiableList());
Java 8 (รายการที่แก้ไขได้)
import static java.util.stream.Collectors.*;
List<String> stringList1 = stringSet.stream().collect(toList());
ตามเอกสารสำหรับวิธีการtoList()
ไม่มีการรับประกันเกี่ยวกับประเภทความไม่แน่นอนความต่อเนื่องของอนุกรมหรือความปลอดภัยของเธรดของรายการที่ส่งคืน หากต้องการการควบคุมมากกว่ารายการที่ส่งคืนให้ใช้ toCollection (ซัพพลายเออร์)
ดังนั้นหากเราต้องการการใช้งานที่เฉพาะเจาะจงเช่นArrayList
เราสามารถทำให้เป็นเช่นนี้:
List<String> stringList2 = stringSet.stream().
collect(toCollection(ArrayList::new));
Java 8 (รายการที่แก้ไขไม่ได้)
เราสามารถใช้Collections::unmodifiableList
วิธีการและห่อรายการที่ส่งคืนในตัวอย่างก่อนหน้านี้ นอกจากนี้เรายังสามารถเขียนวิธีการของเราเองเป็น:
class ImmutableCollector {
public static <T> Collector<T, List<T>, List<T>> toImmutableList(Supplier<List<T>> supplier) {
return Collector.of( supplier, List::add, (left, right) -> {
left.addAll(right);
return left;
}, Collections::unmodifiableList);
}
}
จากนั้นใช้เป็น:
List<String> stringList3 = stringSet.stream()
.collect(ImmutableCollector.toImmutableList(ArrayList::new));
ความเป็นไปได้อีกอย่างคือการใช้collectingAndThen
วิธีการที่อนุญาตให้ทำการเปลี่ยนแปลงขั้นสุดท้ายก่อนที่จะส่งคืนผลลัพธ์:
List<String> stringList4 = stringSet.stream().collect(collectingAndThen(
toCollection(ArrayList::new),Collections::unmodifiableList));
หนึ่งในจุดที่จะต้องทราบคือว่าวิธีการที่Collections::unmodifiableList
จะส่งกลับมุมมอง unmodifiable ของรายการที่ระบุตามเอกสาร คอลเล็กชันมุมมอง unmodifiable คือคอลเล็กชันที่ไม่สามารถแก้ไขได้และเป็นมุมมองไปยังคอลเล็กชันสำรอง โปรดทราบว่าการเปลี่ยนแปลงในคอลเลกชันสำรองอาจยังคงเป็นไปได้และหากเกิดขึ้นพวกเขาจะสามารถมองเห็นได้ผ่านมุมมองที่ไม่สามารถแก้ไขได้ แต่วิธีการเก็บCollectors.unmodifiableList
กลับรายการเปลี่ยนรูปอย่างแท้จริงในการJava 10
java.util.Collection
: O (0)