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

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

4
ทำไมต้องใช้ combiner ในการลดเมธอดที่แปลง type ใน java 8
ฉันมีปัญหาในการทำความเข้าใจบทบาทที่combinerเติมเต็มในreduceวิธีสตรีมอย่างสมบูรณ์ ตัวอย่างเช่นรหัสต่อไปนี้ไม่ได้รวบรวม: int length = asList("str1", "str2").stream() .reduce(0, (accumulatedInt, str) -> accumulatedInt + str.length()); ข้อผิดพลาดในการคอมไพล์แจ้งว่า: (อาร์กิวเมนต์ไม่ตรงกัน; int ไม่สามารถแปลงเป็น java.lang.String) แต่รหัสนี้จะรวบรวม: int length = asList("str1", "str2").stream() .reduce(0, (accumulatedInt, str ) -> accumulatedInt + str.length(), (accumulatedInt, accumulatedInt2) -> accumulatedInt + accumulatedInt2); ฉันเข้าใจว่ามีการใช้วิธี combiner ในลำธารขนาน - ดังนั้นในตัวอย่างของฉันมันได้รวมเข้าด้วยกันสอง ints สะสมกลาง แต่ฉันไม่เข้าใจว่าทำไมตัวอย่างแรกไม่คอมไพล์โดยไม่มี combiner หรือวิธีที่ combiner …
142 java  java-8  java-stream 

6
ในสตรีม Java มองเฉพาะสำหรับการดีบักเท่านั้น?
ฉันกำลังอ่านข้อมูลเกี่ยวกับสตรีม Java และค้นพบสิ่งใหม่ ๆ ในขณะที่ดำเนินการไป หนึ่งในสิ่งใหม่ที่ฉันพบคือpeek()ฟังก์ชัน เกือบทุกอย่างที่ฉันอ่านใน peek บอกว่าควรใช้เพื่อดีบักสตรีมของคุณ จะเกิดอะไรขึ้นถ้าฉันมีสตรีมที่แต่ละบัญชีมีชื่อผู้ใช้ฟิลด์รหัสผ่านและวิธีการเข้าสู่ระบบ () และ loggedIn () ฉันยังมี Consumer<Account> login = account -> account.login(); และ Predicate<Account> loggedIn = account -> account.loggedIn(); ทำไมต้องแย่ขนาดนี้ List<Account> accounts; //assume it's been setup List<Account> loggedInAccount = accounts.stream() .peek(login) .filter(loggedIn) .collect(Collectors.toList()); เท่าที่ฉันสามารถบอกได้ว่าสิ่งนี้ทำในสิ่งที่ตั้งใจจะทำ มัน; รับรายการบัญชี พยายามเข้าสู่ระบบแต่ละบัญชี กรองบัญชีใด ๆ ที่ไม่ได้เข้าสู่ระบบ รวบรวมบัญชีที่เข้าสู่ระบบไว้ในรายการใหม่ …
141 java  java-8  java-stream  peek 

4
Java 8: ประสิทธิภาพของ Streams vs Collections
ฉันยังใหม่กับ Java 8 ฉันยังไม่รู้ API ในเชิงลึก แต่ฉันได้ทำเกณฑ์มาตรฐานอย่างไม่เป็นทางการเพื่อเปรียบเทียบประสิทธิภาพของ Streams API ใหม่กับคอลเลกชันเก่าที่ดี การทดสอบประกอบด้วยในการกรองรายการIntegerและจำนวนคู่แต่ละคำนวณรากและเก็บไว้ในผลของListDouble นี่คือรหัส: public static void main(String[] args) { //Calculating square root of even numbers from 1 to N int min = 1; int max = 1000000; List<Integer> sourceList = new ArrayList<>(); for (int i = min; i < max; i++) …

7
ใน Java 8 ฉันจะแปลง Map <K, V> เป็น Map <K, V> อื่นโดยใช้แลมบ์ดาได้อย่างไร?
ฉันเพิ่งเริ่มดู Java 8 และลอง lambdas ฉันคิดว่าฉันพยายามที่จะเขียนสิ่งที่ง่ายมากที่ฉันเขียนเมื่อเร็ว ๆ นี้ ฉันต้องเปลี่ยน Map of String to Column เป็น Map อื่นของ String to Column โดยที่ Column ใน Map ใหม่นั้นเป็นการป้องกันสำเนาของ Column ใน Map แรก คอลัมน์มีตัวสร้างสำเนา สิ่งที่ฉันได้ใกล้เคียงที่สุดคือ: Map&lt;String, Column&gt; newColumnMap= new HashMap&lt;&gt;(); originalColumnMap.entrySet().stream().forEach(x -&gt; newColumnMap.put(x.getKey(), new Column(x.getValue()))); แต่ฉันแน่ใจว่าต้องมีวิธีที่ดีกว่าในการทำและฉันจะขอบคุณสำหรับคำแนะนำบางอย่าง
140 java  map  lambda  java-8  java-stream 

1
ฉันจะรับรายการจากคุณสมบัติคลาสบางอย่างด้วย Java 8 Stream ได้อย่างไร
ฉันมีList&lt;Person&gt;. ฉันต้องการได้รับListจากทรัพย์สินของPerson. ตัวอย่างเช่นฉันมีPersonชั้นเรียน: class Person { private String name; private String birthDate; public String getName() { return name; } public String getBirthDate() { return birthDate; } Person(String name) { this.name = name; } } List&lt;Person&gt; personList = new ArrayList&lt;&gt;(); personList.add(new Person("David")); personList.add(new Person("Joe")); personList.add(new Person("Michel")); personList.add(new Person("Barak")); ฉันต้องการรับรายชื่อด้วยStreamAPI ดังนี้: List&lt;String&gt; …

6
ฉันจะสร้างสตรีมจากอาร์เรย์ได้อย่างไร
เมื่อใดก็ตามที่ฉันต้องการสร้างสตรีมจากอาร์เรย์ฉันจะทำ String[] array = {"x1", "x2"}; Arrays.asList(array).stream(); มีวิธีโดยตรงในการสร้างสตรีมจากอาร์เรย์หรือไม่?

5
ใน Java อะไรคือข้อดีของการสตรีมผ่านลูป? [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน3 ปีที่ผ่านมา ปรับปรุงคำถามนี้ ฉันถูกถามในการสัมภาษณ์และฉันไม่มั่นใจว่าฉันได้รับคำตอบที่ดีที่สุด ฉันบอกว่าคุณสามารถทำการค้นหาแบบขนานและค่าว่างนั้นถูกจัดการโดยวิธีการบางอย่างที่ฉันจำไม่ได้ ตอนนี้ฉันรู้ว่าฉันกำลังคิดเกี่ยวกับตัวเลือก ฉันหายไปนี่อะไร พวกเขาอ้างว่าเป็นรหัสที่ดีกว่าหรือกระชับกว่า แต่ฉันไม่แน่ใจว่าฉันเห็นด้วยหรือไม่ เมื่อพิจารณาถึงคำตอบที่รัดกุมดูเหมือนว่านี่ไม่ใช่คำถามที่กว้างเกินไป หากพวกเขาถามคำถามนี้ในการสัมภาษณ์และชัดเจนว่าพวกเขามีจุดประสงค์อะไรที่จะทำลายมันได้นอกจากการหาคำตอบให้ได้ยากขึ้น ฉันหมายถึงคุณกำลังมองหาอะไร ฉันสามารถแยกย่อยคำถามและให้ตอบคำถามย่อยทั้งหมด แต่สร้างคำถามหลักพร้อมลิงก์ไปยังคำถามย่อยทั้งหมด ... ดูเหมือนว่างี่เง่า ในขณะที่เราอยู่ที่นี่โปรดยกตัวอย่างคำถามที่กว้างกว่าให้ฉัน ฉันไม่รู้จะถามเพียงบางส่วนของคำถามนี้และยังได้รับคำตอบที่มีความหมาย ฉันสามารถถามคำถามเดียวกันในวิธีที่แตกต่างกัน ตัวอย่างเช่นฉันอาจถามว่า "บริการสตรีมวัตถุประสงค์อะไร" หรือ "ฉันจะใช้สตรีมแทนการวนซ้ำเมื่อใด" หรือ "ทำไมต้องกังวลกับกระแสแทนที่จะเป็นลูป" นี่เป็นคำถามเดียวกันทั้งหมด ... หรือว่ากว้างเกินไปเพราะมีคนให้คำตอบแบบหลายจุดยาวจริง ๆ ? ตรงไปตรงมาทุกคนในรู้สามารถทำได้ด้วยคำถามใด ๆ ตัวอย่างเช่นถ้าคุณเป็นหนึ่งในผู้เขียน JVM คุณอาจพูดถึงลูปได้ทั้งวันเมื่อพวกเราส่วนใหญ่ทำไม่ได้ "โปรดแก้ไขคำถามเพื่อ จำกัด ให้เป็นปัญหาเฉพาะที่มีรายละเอียดเพียงพอที่จะระบุคำตอบที่เพียงพอหลีกเลี่ยงการถามคำถามที่แตกต่างกันในคราวเดียวดูหน้าวิธีถามเพื่อขอความช่วยเหลือในการชี้แจงคำถามนี้" ดังที่ระบุไว้ด้านล่างคำตอบที่เพียงพอได้รับซึ่งพิสูจน์ว่ามีหนึ่งและมันเป็นเรื่องง่ายพอที่จะให้

3
ดึงองค์ประกอบแรกที่ตรงกับเกณฑ์
วิธีรับองค์ประกอบแรกที่ตรงกับเกณฑ์ในสตรีม ฉันได้ลองแล้ว แต่ไม่ได้ผล this.stops.stream().filter(Stop s-&gt; s.getStation().getName().equals(name)); เกณฑ์นั้นไม่ทำงานวิธีการกรองจะถูกเรียกใช้ในคลาสอื่นที่ไม่ใช่ Stop public class Train { private final String name; private final SortedSet&lt;Stop&gt; stops; public Train(String name) { this.name = name; this.stops = new TreeSet&lt;Stop&gt;(); } public void addStop(Stop stop) { this.stops.add(stop); } public Stop getFirstStation() { return this.getStops().first(); } public Stop getLastStation() { …
122 java  java-8  java-stream 

10
คัดลอกสตรีมเพื่อหลีกเลี่ยง "สตรีมได้รับการดำเนินการแล้วหรือปิด"
ฉันต้องการทำสตรีม Java 8 ซ้ำเพื่อที่ฉันจะได้จัดการกับมันสองครั้ง ฉันสามารถcollectเป็นรายการและรับสตรีมใหม่จากสิ่งนั้น // doSomething() returns a stream List&lt;A&gt; thing = doSomething().collect(toList()); thing.stream()... // do stuff thing.stream()... // do other stuff แต่ฉันคิดว่าควรมีวิธีที่มีประสิทธิภาพ / สง่างามกว่านี้ มีวิธีคัดลอกสตรีมโดยไม่เปลี่ยนเป็นคอลเล็กชันหรือไม่? ฉันกำลังทำงานกับสตรีมของEithers จริงๆดังนั้นต้องการประมวลผลการฉายภาพด้านซ้ายทางเดียวก่อนที่จะย้ายไปยังการฉายภาพด้านขวาและจัดการด้วยวิธีอื่น แบบนี้ (ซึ่งจนถึงตอนนี้ฉันบังคับให้ใช้toListเคล็ดลับด้วย) List&lt;Either&lt;Pair&lt;A, Throwable&gt;, A&gt;&gt; results = doSomething().collect(toList()); Stream&lt;Pair&lt;A, Throwable&gt;&gt; failures = results.stream().flatMap(either -&gt; either.left()); failures.forEach(failure -&gt; ... ); Stream&lt;A&gt; successes …


6
รับองค์ประกอบสุดท้ายของสตรีม / รายการในซับเดียว
ฉันจะรับองค์ประกอบสุดท้ายของสตรีมหรือรายการในรหัสต่อไปนี้ได้อย่างไร ที่ไหนdata.careasเป็นList&lt;CArea&gt;: CArea first = data.careas.stream() .filter(c -&gt; c.bbox.orientationHorizontal).findFirst().get(); CArea last = data.careas.stream() .filter(c -&gt; c.bbox.orientationHorizontal) .collect(Collectors.toList()).; //how to? อย่างที่คุณเห็นการรับองค์ประกอบแรกด้วยองค์ประกอบบางอย่างfilterไม่ใช่เรื่องยาก อย่างไรก็ตามการได้รับองค์ประกอบสุดท้ายในหนึ่งซับเป็นความเจ็บปวดอย่างแท้จริง: ดูเหมือนว่าฉันไม่สามารถรับได้โดยตรงจากไฟล์Stream. (มันจะสมเหตุสมผลสำหรับสตรีมที่ จำกัด เท่านั้น) ดูเหมือนว่าคุณไม่สามารถรับสิ่งต่างๆเช่นfirst()และlast()จากListอินเทอร์เฟซได้ซึ่งเป็นความเจ็บปวดจริงๆ ฉันไม่เห็นอาร์กิวเมนต์ใด ๆ ที่ไม่ให้ a first()และlast()method ในListอินเทอร์เฟซเนื่องจากองค์ประกอบในนั้นได้รับคำสั่งและยิ่งกว่านั้นขนาดก็เป็นที่รู้จัก แต่ตามคำตอบเดิม: จะได้รับองค์ประกอบสุดท้ายของ จำกัด ได้Streamอย่างไร? โดยส่วนตัวแล้วนี่เป็นสิ่งที่ใกล้เคียงที่สุดที่ฉันจะได้รับ: int lastIndex = data.careas.stream() .filter(c -&gt; c.bbox.orientationHorizontal) .mapToInt(c -&gt; data.careas.indexOf(c)).max().getAsInt(); CArea last = …
119 java  list  java-8  java-stream 

3
ส่วนต่อประสานการทำงานของ Java 8 ที่ไม่มีอาร์กิวเมนต์และไม่มีค่าส่งคืน
อะไรคืออินเทอร์เฟซการทำงานของ Java 8 สำหรับวิธีการที่ไม่ใช้อะไรเลยและไม่ส่งคืนอะไรเลย กล่าวคือเทียบเท่ากับ C # ที่ไม่มีพารามิเตอร์ที่Actionมีvoidชนิดส่งคืน?
110 java  java-8  java-stream 

20
รวบรวมคู่ต่อเนื่องจากสตรีม
ได้รับกระแสเช่น{ 0, 1, 2, 3, 4 }, ฉันจะเปลี่ยนเป็นรูปแบบที่กำหนดอย่างหรูหราที่สุดได้อย่างไร: { new Pair(0, 1), new Pair(1, 2), new Pair(2, 3), new Pair(3, 4) } (สมมติว่าฉันได้กำหนด class Pair ไว้แล้ว)? แก้ไข:สิ่งนี้ไม่ได้เกี่ยวกับ ints หรือสตรีมดั้งเดิมอย่างเคร่งครัด คำตอบควรเป็นคำตอบทั่วไปสำหรับสตรีมทุกประเภท
102 java  java-8  java-stream 

5
ฉันควรใช้สตรีมเมื่อใด
ฉันเพิ่งเจอคำถามเมื่อใช้ a Listและstream()วิธีการของมัน แม้ว่าฉันจะรู้วิธีใช้ แต่ฉันก็ไม่ค่อยแน่ใจว่าควรใช้เมื่อใด ตัวอย่างเช่นฉันมีรายการที่มีเส้นทางต่างๆไปยังสถานที่ต่างๆ ตอนนี้ฉันต้องการตรวจสอบว่าเส้นทางเดียวที่ระบุมีเส้นทางใด ๆ ที่ระบุในรายการหรือไม่ ฉันต้องการส่งคืนbooleanโดยพิจารณาว่าเป็นไปตามเงื่อนไขหรือไม่ แน่นอนว่านี่ไม่ใช่งานหนัก แต่ฉันสงสัยว่าฉันควรใช้สตรีมหรือสำหรับ (-each) ลูป รายการ private static final List&lt;String&gt; EXCLUDE_PATHS = Arrays.asList(new String[]{ "my/path/one", "my/path/two" }); ตัวอย่าง - สตรีม private boolean isExcluded(String path){ return EXCLUDE_PATHS.stream() .map(String::toLowerCase) .filter(path::contains) .collect(Collectors.toList()) .size() &gt; 0; } ตัวอย่าง - สำหรับ - แต่ละวง private boolean isExcluded(String …
102 java  java-8  java-stream 

15
สตรีม Java 8 พร้อมการประมวลผลแบทช์
ฉันมีไฟล์ขนาดใหญ่ที่มีรายการ ฉันต้องการสร้างชุดรายการสร้างคำขอ HTTP ด้วยชุดนี้ (รายการทั้งหมดจำเป็นต้องใช้เป็นพารามิเตอร์ในคำขอ HTTP) ฉันสามารถทำได้อย่างง่ายดายด้วยการforวนซ้ำ แต่ในฐานะคนรัก Java 8 ฉันต้องการลองเขียนสิ่งนี้ด้วย Stream framework ของ Java 8 (และเก็บเกี่ยวผลประโยชน์จากการประมวลผลแบบขี้เกียจ) ตัวอย่าง: List&lt;String&gt; batch = new ArrayList&lt;&gt;(BATCH_SIZE); for (int i = 0; i &lt; data.size(); i++) { batch.add(data.get(i)); if (batch.size() == BATCH_SIZE) process(batch); } if (batch.size() &gt; 0) process(batch); ฉันต้องการทำบางสิ่งบางอย่างที่เป็นแนวยาว lazyFileStream.group(500).map(processBatch).collect(toList()) วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร?

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