คำถามติดแท็ก java-stream

ใช้แท็กนี้สำหรับคำถามที่เกี่ยวข้องกับการใช้ Stream API มันถูกนำมาใช้ใน Java 8 และสนับสนุนการดำเนินงานสไตล์การทำงานกับกระแสของค่าเช่นท่อกรองลดแผนที่ในคอลเลกชัน

7
วิธีตรวจสอบว่า Java 8 Stream ว่างเปล่าหรือไม่?
ฉันจะตรวจสอบได้อย่างไรว่า a Streamว่างเปล่าและโยนข้อยกเว้นหากไม่ใช่เป็นการดำเนินการที่ไม่ใช่เทอร์มินัล โดยพื้นฐานแล้วฉันกำลังมองหาสิ่งที่เทียบเท่ากับโค้ดด้านล่าง แต่ไม่มีการระบุสตรีมระหว่างนั้น โดยเฉพาะอย่างยิ่งการตรวจสอบไม่ควรเกิดขึ้นก่อนที่สตรีมจะถูกใช้ไปจริงโดยการดำเนินการเทอร์มินัล public Stream<Thing> getFilteredThings() { Stream<Thing> stream = getThings().stream() .filter(Thing::isFoo) .filter(Thing::isBar); return nonEmptyStream(stream, () -> { throw new RuntimeException("No foo bar things available") }); } private static <T> Stream<T> nonEmptyStream(Stream<T> stream, Supplier<T> defaultValue) { List<T> list = stream.collect(Collectors.toList()); if (list.isEmpty()) list.add(defaultValue.get()); return list.stream(); }
100 java  java-8  java-stream 

9
การตรวจสอบค่าว่างหลายรายการใน Java 8
ฉันมีรหัสด้านล่างซึ่งค่อนข้างน่าเกลียดสำหรับการตรวจสอบค่าว่างหลายรายการ String s = null; if (str1 != null) { s = str1; } else if (str2 != null) { s = str2; } else if (str3 != null) { s = str3; } else { s = str4; } ดังนั้นฉันจึงลองใช้Optional.ofNullablelike ด้านล่าง แต่ก็ยังยากที่จะเข้าใจหากมีคนอ่านรหัสของฉัน วิธีที่ดีที่สุดในการทำเช่นนั้นใน Java 8 คืออะไร String s = …

6
การเรียงลำดับรายการด้วย stream.sorted () ใน Java
ฉันสนใจจัดเรียงรายการจากสตรีม นี่คือรหัสที่ฉันใช้: list.stream() .sorted((o1, o2)->o1.getItem().getValue().compareTo(o2.getItem().getValue())) .collect(Collectors.toList()); ฉันพลาดอะไรไปรึเปล่า? รายการไม่ได้เรียงลำดับ ควรจัดเรียงรายการตามรายการที่มีค่าต่ำสุด for (int i = 0; i < list.size(); i++) { System.out.println("list " + (i+1)); print(list, i); } และวิธีการพิมพ์: public static void print(List<List> list, int i) { System.out.println(list.get(i).getItem().getValue()); }

5
เหตุใดฉันจึงไม่สามารถแมปเลขจำนวนเต็มกับสตริงเมื่อสตรีมจากอาร์เรย์ได้
รหัสนี้ใช้งานได้ (ถ่ายใน Javadoc): List<Integer> numbers = Arrays.asList(1, 2, 3, 4); String commaSeparatedNumbers = numbers.stream() .map(i -> i.toString()) .collect(Collectors.joining(", ")); ไม่สามารถรวบรวมสิ่งนี้ได้: int[] numbers = {1, 2, 3, 4}; String commaSeparatedNumbers = Arrays.stream(numbers) .map((Integer i) -> i.toString()) .collect(Collectors.joining(", ")); IDEA บอกฉันว่าฉันมี "สตริงประเภทการส่งคืนที่ไม่เข้ากันในนิพจน์แลมบ์ดา" ทำไม? และจะแก้ไขอย่างไร?


4
'Optional.get ()' โดยไม่ต้องทำเครื่องหมาย 'isPresent ()'
ฉันมีรหัสค้นหาต่อไปนี้ใน Java: return getTableViewController().getMe().getColumns().stream().filter($->Database.equalsColumnName($.getId(), columnId)).findFirst().get(); ฉันต้องการค้นหาคอลัมน์ตามชื่อและส่งกลับรายการแรกที่พบ ฉันเข้าใจว่ามีกรณีที่ไม่พบสิ่งใดและควรดำเนินการอย่างไร นี่คือสิ่งที่ต้องการโดยคำสาบานนี้: 'Optional.get()' without 'isPresent()' check เหรอ? แก้ไขอย่างไร? ฉันต้องการที่จะกลับมาnullหากไม่พบสิ่งใด อัปเดต โอเคโอเคฉันไม่รู้ว่าfindFirst()จะกลับOptionalมา

7
ความแตกต่างระหว่าง findAny () และ findFirst () ใน Java 8
Наэтотвопросестьответына Stack Overflow нарусском : Какиеразличиямежду findFirst и findAny в Java 8? ฉันสับสนเล็กน้อยระหว่างStream#findAny()และStream#findFirst()ของ StreamAPI ใน Java 8 สิ่งที่ฉันเข้าใจคือทั้งสองจะส่งคืนองค์ประกอบแรกที่ตรงกันจากสตรีมเช่นเมื่อใช้ร่วมกับตัวกรอง? เหตุใดจึงมีสองวิธีสำหรับงานเดียวกัน? ฉันพลาดอะไรไปรึเปล่า?

12
Java 8 lambda รับและลบองค์ประกอบจากรายการ
ด้วยรายการองค์ประกอบฉันต้องการรับองค์ประกอบที่มีคุณสมบัติที่กำหนดและลบออกจากรายการ ทางออกที่ดีที่สุดที่ฉันพบคือ: ProducerDTO p = producersProcedureActive .stream() .filter(producer -> producer.getPod().equals(pod)) .findFirst() .get(); producersProcedureActive.remove(p); เป็นไปได้หรือไม่ที่จะรวมการรับและลบในนิพจน์แลมบ์ดา

5
เหตุใด findFirst () จึงโยน NullPointerException หากองค์ประกอบแรกที่พบเป็นโมฆะ
ทำไมถึงโยนjava.lang.NullPointerException? List<String> strings = new ArrayList<>(); strings.add(null); strings.add("test"); String firstString = strings.stream() .findFirst() // Exception thrown here .orElse("StringWhenListIsEmpty"); //.orElse(null); // Changing the `orElse()` to avoid ambiguity รายการแรกstringsคือnullซึ่งเป็นมูลค่าที่ยอมรับได้อย่างสมบูรณ์ นอกจากนี้ยังfindFirst()ส่งคืนตัวเลือกซึ่งเหมาะสมยิ่งกว่าfindFirst()ที่จะสามารถจัดการกับnulls ได้ แก้ไข: อัปเดตorElse()ให้มีความคลุมเครือน้อยลง

6
เป็นไปได้ไหมที่จะใช้ Java 8 Stream API บน Android API <24
เคยอ่านกระทู้นี้ที่นี่ แต่ฉันยังไม่สามารถรันโค้ดที่มีคุณสมบัติ Java 8 Stream API ดังต่อไปนี้บน minSdkVersion &lt;24 List&lt;Car&gt; newCars = cars.stream() .filter(s -&gt; s.getColor().equals("red")) .collect(Collectors.toList()); สิ่งนี้ไม่ทำงานเนื่องจากข้อความแสดงข้อผิดพลาด การโทรต้องใช้ API ระดับ 24 (ขั้นต่ำปัจจุบันคือ 15): java.util.Collection # stream มีใครรู้วิธีแก้ปัญหาบ้างไหม?


5
เราจะจัดการสตรีม jdk8 สำหรับค่า null ได้อย่างไร
สวัสดีเพื่อนนักพัฒนา Java ฉันรู้ว่าหัวเรื่องอาจจะเล็กน้อยin advanceเนื่องจาก JDK8 ยังไม่เปิดตัว (และยังไม่ใช่สำหรับตอนนี้ .. ) แต่ฉันกำลังอ่านบทความเกี่ยวกับนิพจน์ Lambda และโดยเฉพาะส่วนที่เกี่ยวข้องกับ API คอลเล็กชันใหม่ที่เรียกว่า Stream นี่คือตัวอย่างตามที่ระบุในบทความนิตยสาร Java (เป็นอัลกอริธึมประชากรนาก .. ): Set&lt;Otter&gt; otters = getOtters(); System.out.println(otters.stream() .filter(o -&gt; !o.isWild()) .map(o -&gt; o.getKeeper()) .filter(k -&gt; k.isFemale()) .into(new ArrayList&lt;&gt;()) .size()); คำถามของฉันคือจะเกิดอะไรขึ้นถ้าอยู่ตรงกลางของการวนซ้ำภายใน Set ตัวนากตัวใดตัวหนึ่งเป็นโมฆะ ฉันคาดหวังว่า NullPointerException จะถูกโยนทิ้งไป แต่บางทีฉันอาจยังติดอยู่ในกระบวนทัศน์การพัฒนาก่อนหน้านี้ (ไม่สามารถใช้งานได้) ใครบางคนสามารถให้ความกระจ่างแก่ฉันได้ว่าควรจัดการอย่างไร หากนี่เป็นการโยน NullPointerException จริงๆฉันพบว่าคุณลักษณะนี้ค่อนข้างอันตรายและจะต้องใช้เฉพาะดังต่อไปนี้: ผู้พัฒนาเพื่อให้แน่ใจว่าไม่มีค่า …

14
Java 8 สตรีมเพื่อค้นหาองค์ประกอบที่ซ้ำกัน
ฉันกำลังพยายามแสดงรายการองค์ประกอบที่ซ้ำกันในรายการจำนวนเต็มพูดเช่น List&lt;Integer&gt; numbers = Arrays.asList(new Integer[]{1,2,1,3,4,4}); ใช้ Streams ของ jdk 8 มีใครลองบ้าง ในการลบรายการที่ซ้ำกันเราสามารถใช้ API ที่แตกต่างกัน () แต่การค้นหาองค์ประกอบที่ซ้ำกันล่ะ? ใครสามารถช่วยฉันออก?

3
forEach เทียบกับ forEachOrder ใน Java 8 Stream
ฉันเข้าใจว่าวิธีการเหล่านี้ลำดับการดำเนินการแตกต่างกัน แต่ในการทดสอบทั้งหมดของฉันฉันไม่สามารถดำเนินการตามคำสั่งที่แตกต่างกันได้ ตัวอย่าง: System.out.println("forEach Demo"); Stream.of("AAA","BBB","CCC").forEach(s-&gt;System.out.println("Output:"+s)); System.out.println("forEachOrdered Demo"); Stream.of("AAA","BBB","CCC").forEachOrdered(s-&gt;System.out.println("Output:"+s)); เอาท์พุต: forEach Demo Output:AAA Output:BBB Output:CCC forEachOrdered Demo Output:AAA Output:BBB Output:CCC โปรดยกตัวอย่างเมื่อ 2 วิธีจะให้ผลลัพธ์ที่แตกต่างกัน

3
ทำไมสตรีมแบบขนานกับแลมบ์ดาในตัวเริ่มต้นแบบคงที่ทำให้เกิดการชะงักงัน
ฉันเจอสถานการณ์แปลก ๆ ที่การใช้สตรีมคู่ขนานกับแลมบ์ดาในตัวเริ่มต้นแบบคงที่ดูเหมือนตลอดไปโดยไม่มีการใช้งาน CPU นี่คือรหัส: class Deadlock { static { IntStream.range(0, 10000).parallel().map(i -&gt; i).count(); System.out.println("done"); } public static void main(final String[] args) {} } นี่ดูเหมือนจะเป็นกรณีทดสอบขั้นต่ำสำหรับการจำลองพฤติกรรมนี้ ถ้าฉัน: วางบล็อกในวิธีการหลักแทนที่จะเป็นตัวเริ่มต้นแบบคงที่ ลบการขนานหรือ ถอดแลมด้า รหัสจะเสร็จสมบูรณ์ทันที ใครสามารถอธิบายพฤติกรรมนี้? มันเป็นจุดบกพร่องหรือตั้งใจ? ฉันใช้ OpenJDK เวอร์ชัน 1.8.0_66-internal

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.