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

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

21
Java 8 รายการ <V> ลงในแผนที่ <K, V>
ฉันต้องการแปลรายการวัตถุเป็นแผนที่โดยใช้สตรีมและแลมบ์ดาของ Java 8 นี่คือวิธีที่ฉันจะเขียนใน Java 7 และด้านล่าง private Map&lt;String, Choice&gt; nameMap(List&lt;Choice&gt; choices) { final Map&lt;String, Choice&gt; hashMap = new HashMap&lt;&gt;(); for (final Choice choice : choices) { hashMap.put(choice.getName(), choice); } return hashMap; } ฉันสามารถทำได้โดยใช้ Java 8 และ Guava แต่ฉันอยากรู้วิธีการทำสิ่งนี้โดยไม่ใช้ Guava ในฝรั่ง private Map&lt;String, Choice&gt; nameMap(List&lt;Choice&gt; choices) { return Maps.uniqueIndex(choices, new …


19
ความแตกต่างระหว่าง map () และ flatMap () วิธีการใน Java 8 คืออะไร?
มีอะไรใหม่ในStack Overflow ที่ขายดีที่สุด : แผนที่ที่ดีที่สุดของแผนที่ Java หรือไม่? ใน Java 8 ความแตกต่างระหว่างStream.map()และStream.flatMap()วิธีการคืออะไร
709 java  java-8  java-stream 

6
ฉันควรใช้กระแสข้อมูลแบบขนานเสมอเมื่อทำได้
ด้วย Java 8 และ lambdas ทำให้ง่ายต่อการวนซ้ำคอลเลกชันเป็นสตรีมและใช้สตรีมแบบขนานได้อย่างง่ายดาย ตัวอย่างสองตัวอย่างจากเอกสารตัวอย่างที่สองใช้ parallelStream: myShapesCollection.stream() .filter(e -&gt; e.getColor() == Color.RED) .forEach(e -&gt; System.out.println(e.getName())); myShapesCollection.parallelStream() // &lt;-- This one uses parallel .filter(e -&gt; e.getColor() == Color.RED) .forEach(e -&gt; System.out.println(e.getName())); ตราบใดที่ฉันไม่สนใจคำสั่งมันจะเป็นประโยชน์กับการใช้ขนานหรือไม่? ใครจะคิดว่ามันเร็วกว่าการแบ่งงานบนแกนเพิ่มเติม มีข้อควรพิจารณาอื่น ๆ อีกไหม? ควรใช้สตรีมแบบขนานเมื่อใดและควรใช้สตรีมแบบไม่ขนานเมื่อใด (คำถามนี้ขอให้กระตุ้นการสนทนาเกี่ยวกับวิธีการและเวลาในการใช้สตรีมแบบขนานไม่ใช่เพราะฉันคิดว่าการใช้พวกเขาเป็นความคิดที่ดีเสมอ)

6
ค้นหาองค์ประกอบแรกโดยภาคแสดง
ฉันเพิ่งเริ่มเล่นกับ lambdas Java 8 และฉันพยายามใช้บางสิ่งที่ฉันคุ้นเคยในภาษาที่ใช้งานได้ trueยกตัวอย่างเช่นภาษาการทำงานส่วนใหญ่จะมีบางชนิดของฟังก์ชั่นการค้นหาที่ดำเนินการในลำดับหรือรายการที่ส่งกลับองค์ประกอบแรกซึ่งเป็นคำกริยา วิธีเดียวที่ฉันเห็นเพื่อให้บรรลุใน Java 8 คือ: lst.stream() .filter(x -&gt; x &gt; 5) .findFirst() อย่างไรก็ตามสิ่งนี้ดูเหมือนจะไม่มีประสิทธิภาพสำหรับฉันเนื่องจากตัวกรองจะสแกนรายการทั้งหมดอย่างน้อยก็เพื่อความเข้าใจของฉัน (ซึ่งอาจผิด) มีวิธีที่ดีกว่า?
504 java  java-8  java-stream 

8
Java 8 Iterable.forEach () vs foreach loop
ตั้งค่าใหม่ตั้งค่าStack Overflow เป็นภาษาอังกฤษ : Цикл foreach против Iterable.foreach ใน Java 8: чтолучше? ข้อใดต่อไปนี้เป็นแนวทางปฏิบัติที่ดีกว่าใน Java 8 Java 8: joins.forEach(join -&gt; mIrc.join(mSession, join)); Java 7: for (String join : joins) { mIrc.join(mSession, join); } ฉันมีลูปมากมายที่สามารถ "ทำให้ง่ายขึ้น" กับ lambdas แต่มีข้อได้เปรียบอะไรบ้างจากการใช้มัน? มันจะปรับปรุงประสิทธิภาพและความสามารถในการอ่านได้ไหม? แก้ไข ฉันจะขยายคำถามนี้ไปยังวิธีการที่ยาวขึ้น ฉันรู้ว่าคุณไม่สามารถส่งคืนหรือทำลายฟังก์ชั่นหลักจากแลมบ์ดาได้และสิ่งนี้ควรนำมาพิจารณาด้วยเมื่อเปรียบเทียบมัน แต่มีอะไรอีกที่ต้องพิจารณาอีกหรือไม่

27
Java 8 แตกต่างกันตามคุณสมบัติ
ใน Java 8 ฉันจะกรองคอลเล็กชันโดยใช้StreamAPI ได้อย่างไรโดยตรวจสอบความแตกต่างของคุณสมบัติของแต่ละวัตถุ ตัวอย่างเช่นฉันมีรายการPersonวัตถุและฉันต้องการลบคนที่มีชื่อเดียวกัน persons.stream().distinct(); จะใช้การตรวจสอบความเท่าเทียมกันเริ่มต้นสำหรับPersonวัตถุดังนั้นฉันต้องการบางสิ่งเช่น persons.stream().distinct(p -&gt; p.getName()); น่าเสียดายที่distinct()วิธีการนี้ไม่มีการโอเวอร์โหลดดังกล่าว หากไม่มีการแก้ไขการตรวจสอบความเท่าเทียมกันในPersonชั้นเรียนเป็นไปได้ไหมที่จะทำอย่างรัดกุม?

14
การดึงรายการจาก java.util.stream.Stream ใน Java 8
ฉันกำลังเล่นกับ lambdas Java 8 เพื่อกรองคอลเลกชันได้อย่างง่ายดาย แต่ฉันไม่พบวิธีรัดกุมในการดึงผลลัพธ์เป็นรายการใหม่ภายในข้อความเดียวกัน นี่คือแนวทางที่รัดกุมที่สุดของฉัน: List&lt;Long&gt; sourceLongList = Arrays.asList(1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L); List&lt;Long&gt; targetLongList = new ArrayList&lt;&gt;(); sourceLongList.stream().filter(l -&gt; l &gt; 100).forEach(targetLongList::add); ตัวอย่างบนอินเทอร์เน็ตไม่ได้ตอบคำถามของฉันเพราะพวกเขาหยุดโดยไม่สร้างรายการผลลัพธ์ใหม่ จะต้องมีวิธีที่กระชับกว่านี้ ฉันจะคาดหวังว่าStreamชั้นมีวิธีการเป็นtoList(), toSet()... มีวิธีที่ตัวแปรtargetLongListสามารถกำหนดโดยตรงโดยบรรทัดที่สามหรือไม่?

9
แปลง Iterable เป็น Stream โดยใช้ Java 8 JDK
java.lang.Iterable&lt;T&gt;ฉันมีอินเตอร์เฟซที่ส่งกลับ ฉันต้องการจัดการผลลัพธ์นั้นโดยใช้ Java 8 Stream API อย่างไรก็ตาม Iterable ไม่สามารถ "สตรีม" ได้ แนวคิดใดที่จะใช้ Iterable เป็นสตรีมโดยไม่ต้องแปลงเป็น List?

14
กลุ่มเธรดที่กำหนดเองใน Java 8 กระแสขนาน
เป็นไปได้หรือไม่ที่จะระบุเธรดพูลที่กำหนดเองสำหรับ Java 8 stream แบบขนาน ? ฉันไม่สามารถหาได้ทุกที่ ลองนึกภาพว่าฉันมีเซิร์ฟเวอร์แอปพลิเคชันและฉันต้องการใช้กระแสข้อมูลแบบขนาน แต่แอปพลิเคชั่นนั้นมีขนาดใหญ่และมีหลายเธรดดังนั้นฉันจึงต้องการแบ่งย่อยมัน ฉันไม่ต้องการให้งานที่รันช้าในหนึ่งโมดูลของงาน applicationblock จากโมดูลอื่น ถ้าฉันไม่สามารถใช้เธรดพูลที่แตกต่างกันสำหรับโมดูลที่แตกต่างกันก็หมายความว่าฉันไม่สามารถใช้สตรีมแบบขนานได้อย่างปลอดภัยในสถานการณ์จริงส่วนใหญ่ ลองตัวอย่างต่อไปนี้ มีงานที่ใช้งาน CPU มากในหัวข้อแยกต่างหาก งานยกระดับกระแสขนาน ภารกิจแรกถูกทำลายดังนั้นแต่ละขั้นตอนใช้เวลา 1 วินาที (จำลองโดยการนอนหลับของเธรด) ปัญหาคือเธรดอื่นค้างและรอให้งานที่เสียหายเสร็จสิ้น นี่เป็นตัวอย่างที่วางแผนไว้ แต่ลองนึกภาพแอป servlet และมีคนส่งงานที่ใช้เวลานานไปยังกลุ่มการเข้าร่วมส้อมที่ใช้ร่วมกัน public class ParallelTest { public static void main(String[] args) throws InterruptedException { ExecutorService es = Executors.newCachedThreadPool(); es.execute(() -&gt; runTask(1000)); //incorrect task es.execute(() -&gt; …

22
มีวิธีรัดกุมในการวนซ้ำกระแสกับดัชนีใน Java 8 หรือไม่?
มีวิธีรัดกุมในการวนซ้ำสตรีมในขณะที่สามารถเข้าถึงดัชนีในสตรีมได้หรือไม่ String[] names = {"Sam","Pamela", "Dave", "Pascal", "Erik"}; List&lt;String&gt; nameList; Stream&lt;Integer&gt; indices = intRange(1, names.length).boxed(); nameList = zip(indices, stream(names), SimpleEntry::new) .filter(e -&gt; e.getValue().length() &lt;= e.getKey()) .map(Entry::getValue) .collect(toList()); ซึ่งดูเหมือนว่าค่อนข้างน่าผิดหวังเมื่อเทียบกับตัวอย่างของ LINQ ที่ให้ไว้ string[] names = { "Sam", "Pamela", "Dave", "Pascal", "Erik" }; var nameList = names.Where((c, index) =&gt; c.Length &lt;= index + …
382 java  java-8  java-stream 

11
วิธีการรวมรายการจำนวนเต็มกับจาวากระแส?
ฉันต้องการรวมรายการจำนวนเต็ม มันใช้งานได้ดังต่อไปนี้ แต่ไวยากรณ์ไม่ถูกต้อง รหัสสามารถปรับให้เหมาะสมหรือไม่ Map&lt;String, Integer&gt; integers; integers.values().stream().mapToInt(i -&gt; i).sum();
364 java  java-8  java-stream 

12
Java 8 NullPointerException ใน Collector.toMap
Java 8 จะส่งCollectors.toMapa NullPointerExceptionหากค่าใดค่าหนึ่งเป็น 'null' ฉันไม่เข้าใจพฤติกรรมนี้แผนที่สามารถมีพอยน์เตอร์พอยน์เตอร์เป็นค่าโดยไม่มีปัญหาใด ๆ มีเหตุผลที่ดีหรือไม่ที่ค่าต่างๆจะไม่เป็นค่าว่างCollectors.toMap? นอกจากนี้ยังมีวิธีที่ดีของ Java 8 ในการแก้ไขปัญหานี้หรือฉันควรเปลี่ยนกลับเป็น old old for loop หรือไม่? ตัวอย่างของปัญหาของฉัน: import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; class Answer { private int id; private Boolean answer; Answer() { } Answer(int id, Boolean answer) { this.id = id; this.answer = answer; } …

17
ฉันจะโยนข้อยกเว้นตรวจสอบจากภายในสตรีม Java 8 ได้อย่างไร
ฉันจะโยนข้อยกเว้นตรวจสอบจากภายใน Java 8 สตรีม / lambdas ได้อย่างไร กล่าวอีกนัยหนึ่งฉันต้องการสร้างรหัสเช่นคอมไพล์นี้: public List&lt;Class&gt; getClasses() throws ClassNotFoundException { List&lt;Class&gt; classes = Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String") .map(className -&gt; Class.forName(className)) .collect(Collectors.toList()); return classes; } รหัสนี้ไม่ได้รวบรวมเนื่องจากClass.forName()วิธีการดังกล่าวข้างต้นพ่นClassNotFoundExceptionซึ่งมีการตรวจสอบ โปรดทราบฉันไม่ต้องการห่อข้อยกเว้นที่ตรวจสอบภายในข้อยกเว้นรันไทม์และโยนข้อยกเว้นที่ไม่ได้ตรวจสอบและแทนที่ ฉันต้องการที่จะโยนข้อยกเว้นการตรวจสอบตัวเองและไม่เพิ่มน่าเกลียดtry/ catchesกับกระแส

4
Collection.stream (). forEach () และ Collection.forEach () แตกต่างกันอย่างไร?
ฉันเข้าใจว่าด้วย.stream()ฉันสามารถใช้การปฏิบัติการลูกโซ่เช่น.filter()หรือใช้กระแสข้อมูลแบบขนาน แต่อะไรคือความแตกต่างระหว่างพวกเขาหากฉันต้องการดำเนินการเล็ก ๆ (เช่นการพิมพ์องค์ประกอบของรายการ) collection.stream().forEach(System.out::println); collection.forEach(System.out::println);

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