หากฉันมีคอลเล็กชันเช่นCollection<String> strs
ฉันจะนำไอเท็มแรกออกมาได้อย่างไร ฉันสามารถเรียกIterator
ใช้ครั้งแรกnext()
แล้วโยนIterator
ออกไป มีวิธีที่สิ้นเปลืองน้อยลงหรือไม่?
หากฉันมีคอลเล็กชันเช่นCollection<String> strs
ฉันจะนำไอเท็มแรกออกมาได้อย่างไร ฉันสามารถเรียกIterator
ใช้ครั้งแรกnext()
แล้วโยนIterator
ออกไป มีวิธีที่สิ้นเปลืองน้อยลงหรือไม่?
คำตอบ:
Iterables.get (yourC, indexYouWant)
เพราะถ้าคุณใช้ Collections คุณควรใช้ Google Collections
ดูเหมือนว่าเป็นวิธีที่ดีที่สุดที่จะทำ:
String first = strs.iterator().next();
คำถามที่ดี ... ในตอนแรกดูเหมือนว่าการกำกับดูแลสำหรับCollection
อินเทอร์เฟซ
โปรดทราบว่า "ครั้งแรก" จะไม่ส่งคืนสิ่งแรกที่คุณใส่ในคอลเล็กชันเสมอและอาจเหมาะสมสำหรับคอลเลกชันที่สั่งซื้อเท่านั้น อาจเป็นเพราะเหตุใดจึงไม่มีการget(item)
โทรเนื่องจากลำดับอาจไม่ถูกสงวนไว้
แม้ว่ามันอาจจะดูสิ้นเปลือง แต่ก็ไม่ได้แย่อย่างที่คุณคิด ข้อมูลที่Iterator
มีการจัดทำดัชนีจริงๆในคอลเลกชันไม่ใช่สำเนาของคอลเลกชันทั้งหมด การเรียกใช้เมธอดนี้ทำให้อินสแตนซ์Iterator
วัตถุนั้นเป็นค่าใช้จ่ายจริง ๆ เท่านั้น (ไม่เหมือนกับการคัดลอกองค์ประกอบทั้งหมด)
ยกตัวอย่างเช่นมองไปที่ชนิดส่งกลับโดยวิธีการที่เราเห็นว่ามันเป็นArrayList<String>.iterator()
ArrayList::Itr
นี่เป็นคลาสภายในที่เข้าถึงองค์ประกอบของรายการโดยตรงแทนที่จะคัดลอก
เพียงให้แน่ใจว่าคุณตรวจสอบการกลับมาiterator()
เพราะมันอาจจะว่างเปล่าหรือnull
ขึ้นอยู่กับการใช้งาน
ใน java 8:
Optional<String> firstElement = collection.stream().findFirst();
สำหรับ java เวอร์ชันเก่ามีวิธี getFirst ใน Guava Iterables :
Iterables.getFirst(iterable, defaultValue)
getFirst
วิธีให้ใช้ มีget
และgetLast
วิธีการคือ
ไม่มีสิ่งใดเป็นรายการ "แรก" ในรายการCollection
เพราะมันเป็น .. คอลเลกชันที่ง่าย
จากเมธอดCollection.iterator ()ของ Java doc :
ไม่มีการรับประกันใด ๆ เกี่ยวกับลำดับการคืนองค์ประกอบ ...
ดังนั้นคุณไม่สามารถ
หากคุณใช้อินเทอร์เฟซอื่นเช่นรายการคุณสามารถทำสิ่งต่อไปนี้:
String first = strs.get(0);
แต่โดยตรงจากคอลเลกชันนี้เป็นไปไม่ได้
get(int n)
ถูกกำหนดไว้สำหรับCollection
ดูเหมือนว่าคอลเล็กชันของคุณต้องการเป็นแบบรายการดังนั้นฉันขอแนะนำ:
List<String> myList = new ArrayList<String>();
...
String first = myList.get(0);
ใน Java 8 คุณมีโอเปอเรเตอร์จำนวนมากที่จะใช้เช่นขีด จำกัดอินสแตนซ์
/**
* Operator that limit the total number of items emitted through the pipeline
* Shall print
* [1]
* @throws InterruptedException
*/
@Test
public void limitStream() throws InterruptedException {
List<Integer> list = Arrays.asList(1, 2, 3, 1, 4, 2, 3)
.stream()
.limit(1)
.collect(toList());
System.out.println(list);
}
Guava จัดให้มีonlyElement
Collector
แต่ใช้เฉพาะเมื่อคุณคาดหวังว่าคอลเลกชันมีองค์ประกอบเดียวเท่านั้น
Collection<String> stringCollection = ...;
String string = collection.stream().collect(MoreCollectors.onlyElement())
findFirst
หากคุณไม่แน่ใจว่าหลายองค์ประกอบที่มีการใช้งาน
Optional<String> optionalString = collection.stream().findFirst();
คุณสามารถทำการคัดเลือกนักแสดง ตัวอย่างเช่นหากมีอยู่หนึ่งวิธีที่มีคำจำกัดความนี้และคุณรู้ว่าวิธีนี้ส่งคืนรายการ:
Collection<String> getStrings();
และหลังจากเรียกใช้คุณต้องมีองค์ประกอบแรกคุณสามารถทำสิ่งนี้ได้:
List<String> listString = (List) getStrings();
String firstElement = (listString.isEmpty() ? null : listString.get(0));
หากคุณรู้ว่าคอลเล็กชันนั้นเป็นคิวคุณสามารถส่งคอลเล็กชันไปที่คิวและรับได้ง่าย
มีโครงสร้างหลายอย่างที่คุณสามารถใช้เพื่อรับออเดอร์ได้ แต่คุณจะต้องทำการแคสต์มัน
มันขึ้นอยู่กับการใช้งานที่คุณใช้ไม่ว่าจะเป็นรายการที่เชื่อมโยงรายการหรือการใช้งานชุดอื่น ๆ
หากมีการตั้งค่าคุณจะได้รับองค์ประกอบแรกโดยตรงพวกเขาสามารถเป็นเล่ห์กลเหนือคอลเลกชันสร้างตัวแปรของค่า 1 และรับค่าเมื่อค่าสถานะเป็น 1 หลังจากทำลายวงนั้น
ถ้ามันเป็นการใช้งานของรายการมันเป็นเรื่องง่ายโดยการกำหนดหมายเลขดัชนี
วิธีการทำงาน:
public static <T> Optional<T> findFirst(List<T> result) {
return Optional.ofNullable(result)
.map(List::stream)
.flatMap(Stream::findFirst);
}
ข้อมูลโค้ดข้างต้นสงวนจาก NullPointerException และ IndexOutOfBoundsException
List<T>
ไม่เป็นไปตามเงื่อนไขที่ควรใช้กับ a Collection<String>
แต่แน่นอนว่าสามารถแก้ไขได้โดยใช้Collection<T>
กับการเปลี่ยนแปลงเพิ่มเติม: .map(Collection::stream)
.
คุณสามารถทำได้:
String strz[] = strs.toArray(String[strs.size()]);
String theFirstOne = strz[0];
javadoc สำหรับการเก็บรวบรวมให้คำสั่งการเขียนองค์ประกอบของอาเรย์ดังต่อไปนี้:
หากคอลเลกชันนี้ทำให้การรับประกันใด ๆ เป็นสิ่งที่สั่งซื้อองค์ประกอบของมันจะถูกส่งกลับโดย iterator ของมันวิธีการนี้จะต้องกลับองค์ประกอบในลำดับเดียวกัน