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

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

9
เหตุใดสตรีม <T> จึงไม่ใช้ Iterable <T>
ใน Java 8 เรามีคลาส Stream &lt;T&gt;ซึ่งมีวิธีการอยากรู้อยากเห็น Iterator&lt;T&gt; iterator() ดังนั้นคุณคาดหวังว่าจะใช้อินเตอร์เฟสIterable &lt;T&gt;ซึ่งต้องการวิธีการนี้อย่างแน่นอน แต่นั่นไม่ใช่กรณี เมื่อฉันต้องการวนซ้ำสตรีมโดยใช้ลูป foreach ฉันต้องทำอะไรเช่นนี้ public static Iterable&lt;T&gt; getIterable(Stream&lt;T&gt; s) { return new Iterable&lt;T&gt; { @Override public Iterator&lt;T&gt; iterator() { return s.iterator(); } }; } for (T element : getIterable(s)) { ... } ฉันทำอะไรบางอย่างหายไปหรือเปล่า

3
การอ้างอิงเมธอด Java 8: ระบุผู้จัดหาที่มีความสามารถในการจัดหาผลลัพธ์ที่มีพารามิเตอร์
ฉันต้องการใช้ java.util.Optional.orElseThrow() กับประเภทข้อยกเว้นที่ขอพารามิเตอร์คอนสตรัค บางสิ่งเช่นนี้ .orElseThrow(MyException::new(someArgument)) // obviously NOT working มีวิธีในการสร้างผู้จัดหาที่ส่งผ่านค่าอาร์กิวเมนต์ของฉันหรือไม่
259 java  java-8  java-stream 

7
ละเว้นการทำซ้ำเมื่อสร้างแผนที่โดยใช้สตรีม
Map&lt;String, String&gt; phoneBook = people.stream() .collect(toMap(Person::getName, Person::getAddress)); ฉันได้รับjava.lang.IllegalStateException: Duplicate keyเมื่อพบองค์ประกอบที่ซ้ำกัน เป็นไปได้หรือไม่ที่จะละเว้นข้อยกเว้นเช่นการเพิ่มค่าลงในแผนที่? เมื่อมีการทำซ้ำก็ควรดำเนินการต่อโดยละเว้นคีย์ที่ซ้ำกันนั้น
257 java  java-8  java-stream 

3
ทำไม Iterable <T> ไม่ได้ให้วิธีการสตรีม () และ parallelStream ()
ฉันสงสัยว่าทำไมIterableอินเทอร์เฟซไม่ได้ให้stream()และparallelStream()วิธีการ พิจารณาคลาสต่อไปนี้: public class Hand implements Iterable&lt;Card&gt; { private final List&lt;Card&gt; list = new ArrayList&lt;&gt;(); private final int capacity; //... @Override public Iterator&lt;Card&gt; iterator() { return list.iterator(); } } มันคือการนำมือมาใช้เพราะคุณสามารถมีไพ่ในมือขณะเล่นเกมการ์ดซื้อขาย โดยพื้นฐานแล้วมันจะห่อหุ้มList&lt;Card&gt;ให้แน่ใจว่ามีความจุสูงสุดและมีคุณสมบัติที่มีประโยชน์อื่น ๆ List&lt;Card&gt;มันจะดีกว่าขณะที่การดำเนินการนั้นโดยตรงเป็น ตอนนี้เพื่อความมั่นใจฉันคิดว่ามันจะเป็นการดีถ้าจะนำไปใช้Iterable&lt;Card&gt;เช่นคุณสามารถใช้ลูปเสริมสำหรับลูปถ้าคุณต้องการวนซ้ำ ( Handชั้นเรียนของฉันมีget(int index)วิธีการด้วยเหตุนี้สิ่งนี้จึงIterable&lt;Card&gt;เป็นเหตุผลในความคิดของฉัน) Iterableอินเตอร์เฟซให้ดังต่อไปนี้ (ซ้ายออก Javadoc): public interface Iterable&lt;T&gt; { Iterator&lt;T&gt; iterator(); default void forEach(Consumer&lt;? super …

3
Java 8 lambdas, Function.identity () หรือ t-> t
ถ้าเป็นเช่นนั้นStack Overflow จะถูกปล่อยออกมา : Лямбдыใน Java 8, чтолучшеиспользовать - Function.identity () или t-&gt; t? ฉันมีคำถามเกี่ยวกับการใช้Function.identity()วิธีการ ลองนึกภาพโค้ดต่อไปนี้: Arrays.asList("a", "b", "c") .stream() .map(Function.identity()) // &lt;- This, .map(str -&gt; str) // &lt;- is the same as this. .collect(Collectors.toMap( Function.identity(), // &lt;-- And this, str -&gt; str)); // &lt;-- is the same as this. …

12
การใช้ Java 8 เป็นตัวเลือกกับ Stream :: flatMap
เฟรมเวิร์ก Java 8 ใหม่และเพื่อน ๆ สร้างขึ้นมาเพื่อโค้ดจาวาที่รัดกุม แต่ฉันได้เจอกับสถานการณ์ที่เรียบง่ายซึ่งดูเหมือนจะยุ่งยาก พิจารณาและวิธีการList&lt;Thing&gt; things Optional&lt;Other&gt; resolve(Thing thing)ผมต้องการที่จะทำแผนที่Thingเพื่อOptional&lt;Other&gt;s Otherและได้รับเป็นครั้งแรก วิธีแก้ปัญหาที่ชัดเจนคือการใช้things.stream().flatMap(this::resolve).findFirst()แต่flatMapต้องการให้คุณส่งกระแสข้อมูลและOptionalไม่มีstream()วิธี (หรือเป็นCollectionหรือให้วิธีการแปลงเป็นหรือดูเป็นCollection) สิ่งที่ดีที่สุดที่ฉันสามารถทำได้คือ: things.stream() .map(this::resolve) .filter(Optional::isPresent) .map(Optional::get) .findFirst(); แต่ดูเหมือนว่าจะยืดยาวไปมากสำหรับสิ่งที่ดูเหมือนว่าเป็นกรณีที่พบบ่อยมาก ใครมีความคิดที่ดีกว่า

5
เหตุใด Java Streams จึงปิดทันที
ซึ่งแตกต่างจาก C # IEnumerableที่ไพพ์ไลน์การประมวลผลสามารถดำเนินการได้หลายครั้งตามที่เราต้องการใน Java สตรีมสามารถ 'ซ้ำ' เพียงครั้งเดียว การเรียกใช้งานเทอร์มินัลใด ๆ จะปิดสตรีมทำให้ไม่สามารถใช้งานได้ 'คุณสมบัติ' นี้ใช้พลังงานจำนวนมาก ฉันคิดว่าเหตุผลนี้ไม่ใช่เทคนิค สิ่งที่ต้องพิจารณาในการออกแบบภายใต้ข้อ จำกัด ที่แปลกประหลาดนี้คืออะไร? แก้ไข: เพื่อแสดงสิ่งที่ฉันกำลังพูดถึงให้พิจารณาการนำไปใช้งาน Quick-Sort ใน C #: IEnumerable&lt;int&gt; QuickSort(IEnumerable&lt;int&gt; ints) { if (!ints.Any()) { return Enumerable.Empty&lt;int&gt;(); } int pivot = ints.First(); IEnumerable&lt;int&gt; lt = ints.Where(i =&gt; i &lt; pivot); IEnumerable&lt;int&gt; gt = ints.Where(i =&gt; …

4
Java 8 Streams: ตัวกรองหลายตัวเทียบกับเงื่อนไขที่ซับซ้อน
บางครั้งคุณต้องการกรอง a ที่Streamมีมากกว่าหนึ่งเงื่อนไข: myList.stream().filter(x -&gt; x.size() &gt; 10).filter(x -&gt; x.isCool()) ... หรือคุณสามารถทำเช่นเดียวกันกับเงื่อนไขที่ซับซ้อนและเดี่ยว filter : myList.stream().filter(x -&gt; x.size() &gt; 10 &amp;&amp; x -&gt; x.isCool()) ... ฉันเดาว่าวิธีการที่สองมีลักษณะการทำงานที่ดีขึ้น แต่ผมไม่ทราบว่ามัน วิธีแรกชนะได้ในการอ่าน แต่สิ่งที่ดีกว่าสำหรับประสิทธิภาพ?

19
กรอง Java Stream เป็น 1 และ 1 องค์ประกอบเท่านั้น
ฉันกำลังพยายามที่จะใช้ Java 8 เพื่อหาองค์ประกอบในStream LinkedListฉันต้องการรับประกันว่ามีเพียงหนึ่งเดียวที่ตรงกับเกณฑ์ตัวกรอง ใช้รหัสนี้: public static void main(String[] args) { LinkedList&lt;User&gt; users = new LinkedList&lt;&gt;(); users.add(new User(1, "User1")); users.add(new User(2, "User2")); users.add(new User(3, "User3")); User match = users.stream().filter((user) -&gt; user.getId() == 1).findAny().get(); System.out.println(match.toString()); } static class User { @Override public String toString() { return id + " - …

5
สตรีม. min () และ .max () ของ Java 8: ทำไมคอมไพล์นี้
หมายเหตุ: คำถามนี้มาจากลิงก์ตายซึ่งเป็นคำถาม SO ก่อนหน้า แต่นี่จะไป ... ดูรหัสนี้ ( หมายเหตุ: ฉันรู้ว่ารหัสนี้จะไม่ "ทำงาน" และInteger::compareควรใช้ - ฉันเพิ่งแยกมันออกจากคำถามที่เชื่อมโยง ): final ArrayList &lt;Integer&gt; list = IntStream.rangeClosed(1, 20).boxed().collect(Collectors.toList()); System.out.println(list.stream().max(Integer::max).get()); System.out.println(list.stream().min(Integer::min).get()); ตาม Javadoc ของ.min()และข้อโต้แย้งของทั้งสองควรจะเป็น.max() Comparatorแต่ที่นี่การอ้างอิงวิธีการเป็นวิธีการคงที่ของIntegerชั้นเรียน ดังนั้นทำไมการรวบรวมนี้เลย
215 java  java-8  java-stream 

9
Java8: HashMap <X, Y> ถึง HashMap <X, Z> โดยใช้ Stream / Map-Reduce / Collector
ฉันรู้วิธีการ "แปลง" Java ง่ายๆListจากY-&gt; Zคือ: List&lt;String&gt; x; List&lt;Integer&gt; y = x.stream() .map(s -&gt; Integer.parseInt(s)) .collect(Collectors.toList()); ตอนนี้ฉันต้องการทำแบบเดียวกันกับแผนที่กล่าวคือ: INPUT: { "key1" -&gt; "41", // "41" and "42" "key2" -&gt; "42 // are Strings } OUTPUT: { "key1" -&gt; 41, // 41 and 42 "key2" -&gt; 42 // are Integers } การแก้ปัญหาไม่ควรจะ จำกัด-&gt;String …

13
การใช้ Java 8 เพื่อแปลงรายการของวัตถุเป็นสตริงที่ได้จากเมธอด toString ()
มีสิ่งใหม่ที่มีประโยชน์มากมายใน Java 8 เช่นฉันสามารถวนซ้ำกับรายการวัตถุแล้วรวมค่าจากฟิลด์เฉพาะของObjectอินสแตนซ์ของ เช่น public class AClass { private int value; public int getValue() { return value; } } Integer sum = list.stream().mapToInt(AClass::getValue).sum(); ดังนั้นฉันถามว่ามีวิธีการสร้างStringที่เชื่อมต่อผลลัพธ์ของtoString()วิธีการจากกรณีในบรรทัดเดียว List&lt;Integer&gt; list = ... String concatenated = list.stream().... //concatenate here with toString() method from java.lang.Integer class สมมติว่าlistมีจำนวนเต็ม1, 2และ3ผมคาดหวังว่าconcatenatedจะเป็นหรือ"123""1,2,3"

4
Java 8 สตรีมและการใช้งานบนอาร์เรย์
ฉันเพิ่งค้นพบความสามารถของสตรีม Java 8 ใหม่ มาจาก Python ฉันสงสัยว่าตอนนี้มีวิธีที่ประณีตในการดำเนินการกับอาเรย์เช่นการหาผลรวมการคูณสองอาร์เรย์ในรูปแบบ "one pythonic" หรือไม่? ขอบคุณ

8
Java 8 - วิธีที่ดีที่สุดในการแปลงรายการ: แผนที่หรือ foreach?
ฉันมีรายการmyListToParseที่ฉันต้องการกรององค์ประกอบและใช้วิธีการในแต่ละองค์ประกอบและเพิ่มผลลัพธ์ในรายการอื่นmyFinalListที่ฉันต้องการกรององค์ประกอบและวิธีการใช้ในแต่ละองค์ประกอบและเพิ่มผลในรายการอื่น ด้วย Java 8 ฉันสังเกตเห็นว่าฉันสามารถทำได้สองวิธีที่แตกต่างกัน ฉันต้องการทราบวิธีที่มีประสิทธิภาพมากขึ้นระหว่างพวกเขาและเข้าใจว่าทำไมวิธีหนึ่งจึงดีกว่าอีกวิธีหนึ่ง ฉันเปิดรับข้อเสนอแนะเกี่ยวกับวิธีที่สาม วิธีที่ 1: myFinalList = new ArrayList&lt;&gt;(); myListToParse.stream() .filter(elt -&gt; elt != null) .forEach(elt -&gt; myFinalList.add(doSomething(elt))); วิธีที่ 2: myFinalList = myListToParse.stream() .filter(elt -&gt; elt != null) .map(elt -&gt; doSomething(elt)) .collect(Collectors.toList());
188 java  java-8  java-stream 

19
จำกัด กระแสโดยเพรดิเคต
มีการดำเนินการสตรีม Java 8 ที่ จำกัด (อาจไม่มีที่สิ้นสุด) Streamจนกว่าองค์ประกอบแรกจะไม่ตรงกับภาคแสดงหรือไม่? ใน Java 9 เราสามารถใช้takeWhileตามตัวอย่างด้านล่างเพื่อพิมพ์ตัวเลขทั้งหมดที่น้อยกว่า 10 IntStream .iterate(1, n -&gt; n + 1) .takeWhile(n -&gt; n &lt; 10) .forEach(System.out::println); เนื่องจากไม่มีการดำเนินการดังกล่าวใน Java 8 วิธีที่ดีที่สุดในการนำไปใช้ในทางทั่วไปคืออะไร?
187 java  java-8  java-stream 

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