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

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

3
แลมบ์ดานิพจน์สร้างวัตถุบนฮีปทุกครั้งที่ถูกประมวลผลหรือไม่?
เมื่อฉันทำซ้ำคอลเลกชันโดยใช้น้ำตาล syntactic ใหม่ของ Java 8 เช่น myStream.forEach(item -> { // do something useful }); นี่ไม่เทียบเท่ากับตัวอย่าง 'ไวยากรณ์เก่า' ด้านล่างใช่หรือไม่ myStream.forEach(new Consumer<Item>() { @Override public void accept(Item item) { // do something useful } }); สิ่งนี้หมายความว่ามีการสร้างConsumerวัตถุนิรนามใหม่บน heap ทุกครั้งที่ทำซ้ำคอลเลกชันหรือไม่ ใช้พื้นที่ของกองมากเท่าไร ความหมายของประสิทธิภาพการทำงานมีอะไรบ้าง มันหมายความว่าฉันควรใช้รูปแบบเก่าสำหรับลูปเมื่อวนซ้ำโครงสร้างข้อมูลหลายระดับขนาดใหญ่หรือไม่?
182 java  lambda  java-8 

9
วิธีใช้แลมบ์ดาของ Java8 เพื่อจัดเรียงสตรีมในลำดับย้อนกลับ
ฉันใช้แลมบ์ดา java เพื่อเรียงลำดับรายการ ฉันจะจัดเรียงมันในทางกลับกันได้อย่างไร ฉันเห็นโพสต์นี้แต่ฉันต้องการใช้ java 8 แลมบ์ดา นี่คือรหัสของฉัน (ฉันใช้ * -1) เป็นแฮ็ค Arrays.asList(files).stream() .filter(file -> isNameLikeBaseLine(file, baseLineFile.getName())) .sorted(new Comparator<File>() { public int compare(File o1, File o2) { int answer; if (o1.lastModified() == o2.lastModified()) { answer = 0; } else if (o1.lastModified() > o2.lastModified()) { answer = 1; } else …

4
Java 8 Stream.collect ใดที่มีอยู่ในไลบรารี Kotlin มาตรฐาน
ใน Java 8 มีการStream.collectอนุญาตให้รวมตัวกันบนคอลเลกชัน ใน Kotlin สิ่งนี้ไม่ได้อยู่ในลักษณะเดียวกันนอกเหนือไปจากบางทีอาจเป็นชุดของฟังก์ชันส่วนขยายใน stdlib แต่มันไม่ชัดเจนว่าการเทียบเคียงสำหรับกรณีการใช้งานที่แตกต่างกันอย่างไร ตัวอย่างเช่นที่ด้านบนของ JavaDoc สำหรับCollectorsเป็นตัวอย่างที่เขียนขึ้นสำหรับ Java 8 และเมื่อย้ายไปยัง Kolin คุณจะไม่สามารถใช้คลาส Java 8 เมื่ออยู่ในรุ่น JDK ที่แตกต่างกันดังนั้นจึงเป็นไปได้ว่าพวกเขาควรจะเขียนต่างกัน ในแง่ของทรัพยากรออนไลน์แสดงตัวอย่างของคอลเลกชัน Kotlin พวกเขามักจะเล็กน้อยและไม่ได้เปรียบเทียบกับกรณีการใช้งานที่เหมือนกัน มีตัวอย่างที่ดีอะไรบ้างที่ตรงกับเคสเช่นเอกสารสำหรับ Java 8 Stream.collect? รายการมี: สะสมชื่อลงในรายการ สะสมชื่อลงใน TreeSet แปลงองค์ประกอบเป็นสตริงและเชื่อมต่อพวกเขาคั่นด้วยเครื่องหมายจุลภาค คำนวณผลรวมของเงินเดือนของพนักงาน จัดกลุ่มพนักงานตามแผนก คำนวณยอดรวมเงินเดือนตามแผนก แบ่งนักเรียนให้ผ่านและไม่ผ่าน ด้วยรายละเอียดใน JavaDoc ที่ลิงค์ด้านบน หมายเหตุ: คำถามนี้เขียนโดยเจตนาและตอบโดยผู้เขียน ( คำถามที่ตอบด้วยตนเอง ) ดังนั้นคำตอบที่เป็นไปตามหัวข้อ Kotlin ที่ถูกถามบ่อยนั้นมีอยู่ใน SO …

5
การเพิ่ม BigDecimals โดยใช้ Streams
ฉันมีคอลเลกชันของ BigDecimals (ในตัวอย่างนี้กLinkedList) ที่ฉันต้องการเพิ่มเข้าด้วยกัน เป็นไปได้ไหมที่จะใช้สตรีมสำหรับสิ่งนี้ ฉันสังเกตเห็นว่าStreamห้องเรียนมีหลายวิธี Stream::mapToInt Stream::mapToDouble Stream::mapToLong ซึ่งแต่ละsum()วิธีมีวิธีที่สะดวก แต่อย่างที่เรารู้floatและdoubleเลขคณิตเป็นความคิดที่เลว ดังนั้นมีวิธีที่สะดวกในการสรุป BigDecimals หรือไม่ นี่คือรหัสที่ฉันมี public static void main(String[] args) { LinkedList<BigDecimal> values = new LinkedList<>(); values.add(BigDecimal.valueOf(.1)); values.add(BigDecimal.valueOf(1.1)); values.add(BigDecimal.valueOf(2.1)); values.add(BigDecimal.valueOf(.1)); // Classical Java approach BigDecimal sum = BigDecimal.ZERO; for(BigDecimal value : values) { System.out.println(value); sum = sum.add(value); } System.out.println("Sum = …

7
Java 8: ฉันจะทำงานกับเมธอดการโยนข้อยกเว้นในสตรีมได้อย่างไร
สมมติว่าฉันมีชั้นเรียนและวิธีการ class A { void foo() throws Exception() { ... } } ตอนนี้ฉันต้องการเรียก foo สำหรับแต่ละอินสแตนซ์ที่Aส่งโดยสตรีมเช่น: void bar() throws Exception { Stream<A> as = ... as.forEach(a -> a.foo()); } คำถาม: ฉันจะจัดการข้อยกเว้นได้อย่างถูกต้องได้อย่างไร? รหัสไม่ได้รวบรวมในเครื่องของฉันเพราะฉันไม่จัดการข้อยกเว้นที่เป็นไปได้ที่สามารถโยนโดย foo () throws Exceptionของbarดูเหมือนว่าจะไร้ประโยชน์ที่นี่ ทำไมถึงเป็นอย่างนั้น?

2
ประเภทผลตอบแทนทั่วไปที่ถูกผูกไว้ด้านบน - ส่วนต่อประสานกับชั้นเรียน - รหัสที่ถูกต้องน่าแปลกใจ
นี่คือตัวอย่างในโลกแห่งความเป็นจริงจาก API ไลบรารีบุคคลที่ 3 แต่ง่ายขึ้น คอมไพล์ด้วย Oracle JDK 8u72 พิจารณาทั้งสองวิธี: <X extends CharSequence> X getCharSequence() { return (X) "hello"; } <X extends String> X getString() { return (X) "hello"; } ทั้งคู่รายงานคำเตือน "นักแสดงที่ไม่ได้ตรวจสอบ" - ฉันเข้าใจว่าทำไม สิ่งที่ทำให้ฉันงุนงงคือทำไมฉันถึงโทรได้ Integer x = getCharSequence(); และมันรวบรวม? คอมไพเลอร์ควรจะรู้ว่าไม่ใช้Integer CharSequenceการโทรไป Integer y = getString(); ให้ข้อผิดพลาด (ตามที่คาดไว้) incompatible types: …
171 java  generics  java-8 

6
จัดกลุ่มตามจำนวนใน Java 8 stream API
ฉันพยายามหาวิธีง่ายๆใน Java 8 stream API เพื่อทำการจัดกลุ่มฉันออกมาด้วยวิธีที่ซับซ้อนนี้! List<String> list = new ArrayList<>(); list.add("Hello"); list.add("Hello"); list.add("World"); Map<String, List<String>> collect = list.stream().collect( Collectors.groupingBy(o -> o)); System.out.println(collect); List<String[]> collect2 = collect .entrySet() .stream() .map(e -> new String[] { e.getKey(), String.valueOf(e.getValue().size()) }) .collect(Collectors.toList()); collect2.forEach(o -> System.out.println(o[0] + " >> " + o[1])); ฉันขอขอบคุณที่คุณป้อนข้อมูล

5
ตัวดำเนินการลูกศร '->' ทำอะไรใน Java
ในขณะที่กำลังค้นหารหัสฉันพบผู้ปฏิบัติงานลูกศรมันทำอะไรกันแน่? ฉันคิดว่า Java ไม่มีโอเปอเรเตอร์ Arrow return (Collection<Car>) CollectionUtils.select(listOfCars, (arg0) -> { return Car.SEDAN == ((Car)arg0).getStyle(); }); รายละเอียด : Java 6, Apache Commons Collection, IntelliJ 12 อัปเดต / ตอบ:ปรากฎว่า IntelliJ 12 รองรับ Java 8 ซึ่งรองรับ lambdas และเป็น "การพับ" เพรดิเคตและแสดงเป็น lambdas ด้านล่างคือรหัส "ไม่ถูกพับ" return (Collection<Car>) CollectionUtils.select(listOfCars, new Predicate() { public boolean evaluate(Object …

15
Java 8: Lambda-Streams, กรองตามวิธีการยกเว้น
ฉันมีปัญหาในการทดลองใช้แลมบ์ดานิพจน์ของ Java 8 โดยปกติแล้วจะใช้งานได้ดี แต่ตอนนี้ฉันมีวิธีการที่ใช้IOExceptionแล้ว เป็นการดีที่สุดถ้าคุณดูรหัสต่อไปนี้: class Bank{ .... public Set<String> getActiveAccountNumbers() throws IOException { Stream<Account> s = accounts.values().stream(); s = s.filter(a -> a.isActive()); Stream<String> ss = s.map(a -> a.getNumber()); return ss.collect(Collectors.toSet()); } .... } interface Account{ .... boolean isActive() throws IOException; String getNumber() throws IOException; .... } ปัญหาคือมันไม่ได้รวบรวมเพราะฉันต้องจับข้อยกเว้นที่เป็นไปได้ของ isActive- …

8
Intellij - ไม่สามารถใช้คลาส Java 8 ที่ใหม่กว่า - ข้อผิดพลาด:“ การใช้ API ที่บันทึกเป็น @since 1.6+ .. ”
ฉันพยายามใช้java.lang.function.Functionในฐานรหัส java 8 ของฉัน แต่ฉันยังคงได้รับข้อผิดพลาดต่อไปนี้ใน Intellij การใช้ API ที่บันทึกเป็น @since 1.6+ การตรวจสอบนี้จะค้นหาวิธีการทั้งหมดที่มี @since แท็กในเอกสารประกอบ สิ่งนี้อาจมีประโยชน์เมื่อทำการพัฒนาภายใต้ SDK รุ่นใหม่กว่าเป็นแพลตฟอร์มเป้าหมายสำหรับการผลิต ฉันดูเหมือนจะมีการตั้งค่าโครงการและคอมไพเลอร์ที่ถูกต้อง การตั้งค่าโครงการ: (ไฟล์ -> โครงสร้างโครงการ) Project Settings -> Project -> Project SDK = Java 1.8 Project Settings -> Project -> Project Language Level = 8 - Lambdas, Type Annotations etc การตั้งค่าคอมไพเลอร์: (ไฟล์ -> …

8
การเพิ่ม Java 8 สตรีมสองรายการหรือองค์ประกอบพิเศษให้กับสตรีม
ฉันสามารถเพิ่มสตรีมหรือองค์ประกอบเพิ่มเติมเช่นนี้ Stream stream = Stream.concat(stream1, Stream.concat(stream2, Stream.of(element)); และฉันสามารถเพิ่มสิ่งใหม่ตามที่ฉันไปเช่นนี้ Stream stream = Stream.concat( Stream.concat( stream1.filter(x -> x!=0), stream2) .filter(x -> x!=1), Stream.of(element)) .filter(x -> x!=2); แต่นี่น่าเกลียดเพราะconcatเป็นแบบคงที่ หากconcatเป็นวิธีการแบบอินสแตนซ์ตัวอย่างด้านบนจะง่ายต่อการอ่านมากขึ้น: Stream stream = stream1.concat(stream2).concat(element); และ Stream stream = stream1 .filter(x -> x!=0) .concat(stream2) .filter(x -> x!=1) .concat(element) .filter(x -> x!=2); คำถามของฉันคือ: 1) มีเหตุผลที่ดีใด ๆ …

5
โค้ด Java 8 สามารถคอมไพล์ให้รันบน Java 7 JVM ได้หรือไม่?
Java 8 แนะนำคุณสมบัติภาษาใหม่ที่สำคัญเช่นการแสดงออกแลมบ์ดา การเปลี่ยนแปลงเหล่านี้ในภาษานั้นมาพร้อมกับการเปลี่ยนแปลงที่สำคัญเช่นนั้นในโค้ดไบต์ที่คอมไพล์ซึ่งจะป้องกันไม่ให้รันบนเครื่องเสมือน Java 7 โดยไม่ต้องใช้ตัวแปลงสัญญาณซ้ำบางตัวหรือไม่?

9
ฉันควรส่งคืนคอลเล็กชันหรือสตรีมหรือไม่
สมมติว่าฉันมีวิธีที่ส่งกลับมุมมองแบบอ่านอย่างเดียวในรายการสมาชิก: class Team { private List < Player > players = new ArrayList < > (); // ... public List < Player > getPlayers() { return Collections.unmodifiableList(players); } } นอกจากนี้สมมติว่าลูกค้าทั้งหมดทำซ้ำในรายการทันที อาจจะนำผู้เล่นเข้าสู่ JList หรืออะไรบางอย่าง ลูกค้าไม่ได้จัดเก็บการอ้างอิงไปยังรายการสำหรับการตรวจสอบในภายหลัง! ในสถานการณ์ทั่วไปนี้ฉันควรส่งคืนสตรีมแทนหรือไม่ public Stream < Player > getPlayers() { return players.stream(); } หรือส่งคืนสตรีมที่ไม่มีลักษณะเฉพาะใน Java หรือไม่ สตรีมที่ออกแบบมาให้ "ยุติ" …


6
กรองค่าเฉพาะในกรณีที่ไม่ใช่ค่า null โดยใช้แลมบ์ดาใน Java8
carฉันมีรายชื่อของวัตถุที่พูด ฉันต้องการที่จะกรองรายการนี้ขึ้นอยู่กับพารามิเตอร์บางโดยใช้ Java 8. แต่ถ้าพารามิเตอร์เป็นมันจะพ่นnull NullPointerExceptionจะกรองค่า Null ได้อย่างไร? รหัสปัจจุบันมีดังนี้ requiredCars = cars.stream().filter(c -> c.getName().startsWith("M")); นี้พ่นNullPointerExceptionถ้าผลตอบแทนgetName()null

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