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

ใช้แท็กนี้สำหรับคำถามเฉพาะสำหรับ Java 8 ซึ่งเป็นรุ่น 8 (หมายเลขภายใน 1.8) ของแพลตฟอร์ม Java ซึ่งเปิดตัวในวันที่ 18 มีนาคม 2014 ในกรณีส่วนใหญ่คุณควรระบุแท็ก java ด้วย

7
วิธีแปลง iterator เป็นสตรีม
ฉันกำลังมองหาวิธีที่กระชับในการแปลงIteratorเป็นStreamหรือมากกว่าโดยเฉพาะเพื่อ "ดู" ตัววนซ้ำเป็นสตรีม เพื่อเหตุผลด้านประสิทธิภาพฉันต้องการหลีกเลี่ยงสำเนาตัววนซ้ำในรายการใหม่: Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator(); Collection<String> copyList = new ArrayList<String>(); sourceIterator.forEachRemaining(copyList::add); Stream<String> targetStream = copyList.stream(); จากคำแนะนำในความคิดเห็นฉันได้ลองใช้Stream.generate: public static void main(String[] args) throws Exception { Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator(); Stream<String> targetStream = Stream.generate(sourceIterator::next); targetStream.forEach(System.out::println); } อย่างไรก็ตามฉันได้รับNoSuchElementException(เนื่องจากไม่มีการร้องขอhasNext) Exception in thread "main" java.util.NoSuchElementException at java.util.AbstractList$Itr.next(AbstractList.java:364) at …
468 java  iterator  java-8 

8
Java 8 Iterable.forEach () vs foreach loop
ตั้งค่าใหม่ตั้งค่าStack Overflow เป็นภาษาอังกฤษ : Цикл foreach против Iterable.foreach ใน Java 8: чтолучше? ข้อใดต่อไปนี้เป็นแนวทางปฏิบัติที่ดีกว่าใน Java 8 Java 8: joins.forEach(join -> 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 -> p.getName()); น่าเสียดายที่distinct()วิธีการนี้ไม่มีการโอเวอร์โหลดดังกล่าว หากไม่มีการแก้ไขการตรวจสอบความเท่าเทียมกันในPersonชั้นเรียนเป็นไปได้ไหมที่จะทำอย่างรัดกุม?

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

9
แปลง Iterable เป็น Stream โดยใช้ Java 8 JDK
java.lang.Iterable<T>ฉันมีอินเตอร์เฟซที่ส่งกลับ ฉันต้องการจัดการผลลัพธ์นั้นโดยใช้ 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(() -> runTask(1000)); //incorrect task es.execute(() -> …

18
ทำไมตัวเลือก Java 8 จึงไม่ควรใช้ในการโต้แย้ง
ฉันได้อ่านบนเว็บไซต์หลายแห่งทางเลือกควรใช้เป็นประเภทส่งคืนเท่านั้นและไม่ได้ใช้ในการโต้แย้งเมธอด ฉันกำลังดิ้นรนเพื่อหาเหตุผลเชิงเหตุผล ตัวอย่างเช่นฉันมีชิ้นส่วนของตรรกะซึ่งมี 2 พารามิเตอร์ทางเลือก ดังนั้นฉันคิดว่ามันสมเหตุสมผลที่จะเขียนลายเซ็นวิธีของฉันเช่นนี้ (โซลูชันที่ 1): public int calculateSomething(Optional<String> p1, Optional<BigDecimal> p2 { // my logic } หน้าเว็บจำนวนมากระบุตัวเลือกที่ไม่ควรใช้เป็นข้อโต้แย้งวิธี ด้วยสิ่งนี้ในใจฉันสามารถใช้ลายเซ็นวิธีการต่อไปนี้และเพิ่มความคิดเห็น Javadoc ที่ชัดเจนเพื่อระบุว่าอาร์กิวเมนต์อาจเป็นโมฆะหวังว่าผู้ดูแลในอนาคตจะอ่าน Javadoc ดังนั้นจึงต้องทำการตรวจสอบ null ก่อนที่จะใช้อาร์กิวเมนต์ (โซลูชัน 2) : public int calculateSomething(String p1, BigDecimal p2) { // my logic } หรือฉันสามารถแทนที่วิธีของฉันด้วยวิธีสาธารณะสี่วิธีเพื่อให้อินเทอร์เฟซที่ดีกว่าและทำให้ p1 และ p2 ชัดเจนยิ่งขึ้นเป็นตัวเลือก (โซลูชัน 3): public int …
392 java  java-8  optional 

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


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

14
ความแตกต่างระหว่างสุดท้ายและสุดท้ายได้อย่างมีประสิทธิภาพ
ฉันเล่นกับ lambdas ในชวา 8 local variables referenced from a lambda expression must be final or effectively finalและฉันมาข้ามคำเตือน ฉันรู้ว่าเมื่อฉันใช้ตัวแปรภายในคลาสนิรนามพวกเขาจะต้องเป็นคนสุดท้ายในชั้นนอก แต่ยัง - อะไรคือความแตกต่างระหว่างขั้นสุดท้ายและสุดท้ายอย่างมีประสิทธิภาพ ?

6
วิธีการแยก / จัดรูปแบบวันที่ด้วย LocalDateTime (Java 8)
Java 8 เพิ่มjava.timeใหม่ APIสำหรับการทำงานกับวันที่และเวลา ( JSR 310 ) ฉันมีวันที่และเวลาเป็นสตริง (เช่น"2014-04-08 12:30") ฉันจะได้รับLocalDateTimeอินสแตนซ์จากสตริงที่กำหนดได้อย่างไร หลังจากฉันทำงานกับLocalDateTimeวัตถุเสร็จแล้ว: ฉันจะแปลงLocalDateTimeอินสแตนซ์กลับเป็นสตริงด้วยรูปแบบเดียวกับที่แสดงข้างต้นได้อย่างไร

5
เหตุใดจึงไม่อนุญาต“ ขั้นสุดท้าย” ในวิธีส่วนต่อประสาน Java 8
หนึ่งในคุณสมบัติที่มีประโยชน์ที่สุดของ Java 8 คือdefaultวิธีการใหม่ในส่วนต่อประสาน มีสองเหตุผลหลัก (อาจมีเหตุผลอื่น) ทำไมพวกเขาถึงได้รับการแนะนำ: ให้การใช้งานเริ่มต้นจริง ตัวอย่าง:Iterator.remove() อนุญาตให้ใช้กับวิวัฒนาการ JDK API ตัวอย่าง:Iterable.forEach() จากมุมมองของนักออกแบบ API ของผมจะชอบที่จะสามารถใช้การปรับเปลี่ยนวิธีการอื่น ๆ finalบนอินเตอร์เฟซเช่น สิ่งนี้จะเป็นประโยชน์เมื่อเพิ่มวิธีอำนวยความสะดวกป้องกันการแทนที่ "โดยไม่ตั้งใจ" ในการใช้คลาส: interface Sender { // Convenience method to send an empty message default final void send() { send(null); } // Implementations should only implement this method void send(String message); } …

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; } …

12
วิธีคัดค้านวิธีอ้างอิงกริยา
ใน Java 8 คุณสามารถใช้การอ้างอิงเมธอดเพื่อกรองสตรีมตัวอย่างเช่น: Stream<String> s = ...; long emptyStrings = s.filter(String::isEmpty).count(); มีวิธีการสร้างการอ้างอิงวิธีการที่เป็นลบล้างของที่มีอยู่คืออะไรเช่น: long nonEmptyStrings = s.filter(not(String::isEmpty)).count(); ฉันสามารถสร้างnotวิธีการด้านล่าง แต่ฉันสงสัยว่า JDK เสนอสิ่งที่คล้ายกัน static <T> Predicate<T> not(Predicate<T> p) { return o -> !p.test(o); }
330 java  predicate  java-8  negate 

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