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

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

3
forEach เทียบกับ forEachOrder ใน Java 8 Stream
ฉันเข้าใจว่าวิธีการเหล่านี้ลำดับการดำเนินการแตกต่างกัน แต่ในการทดสอบทั้งหมดของฉันฉันไม่สามารถดำเนินการตามคำสั่งที่แตกต่างกันได้ ตัวอย่าง: System.out.println("forEach Demo"); Stream.of("AAA","BBB","CCC").forEach(s->System.out.println("Output:"+s)); System.out.println("forEachOrdered Demo"); Stream.of("AAA","BBB","CCC").forEachOrdered(s->System.out.println("Output:"+s)); เอาท์พุต: forEach Demo Output:AAA Output:BBB Output:CCC forEachOrdered Demo Output:AAA Output:BBB Output:CCC โปรดยกตัวอย่างเมื่อ 2 วิธีจะให้ผลลัพธ์ที่แตกต่างกัน

3
ทำไมสตรีมแบบขนานกับแลมบ์ดาในตัวเริ่มต้นแบบคงที่ทำให้เกิดการชะงักงัน
ฉันเจอสถานการณ์แปลก ๆ ที่การใช้สตรีมคู่ขนานกับแลมบ์ดาในตัวเริ่มต้นแบบคงที่ดูเหมือนตลอดไปโดยไม่มีการใช้งาน CPU นี่คือรหัส: class Deadlock { static { IntStream.range(0, 10000).parallel().map(i -> i).count(); System.out.println("done"); } public static void main(final String[] args) {} } นี่ดูเหมือนจะเป็นกรณีทดสอบขั้นต่ำสำหรับการจำลองพฤติกรรมนี้ ถ้าฉัน: วางบล็อกในวิธีการหลักแทนที่จะเป็นตัวเริ่มต้นแบบคงที่ ลบการขนานหรือ ถอดแลมด้า รหัสจะเสร็จสมบูรณ์ทันที ใครสามารถอธิบายพฤติกรรมนี้? มันเป็นจุดบกพร่องหรือตั้งใจ? ฉันใช้ OpenJDK เวอร์ชัน 1.8.0_66-internal

7
ตัวอย่างเมธอด Java 8 Streams FlatMap
ฉันได้ตรวจสอบสิ่งที่กำลังจะมาถึงJava updateคือ: Java 8 or JDK 8. ใช่ฉันเป็นคนใจร้อนมีของใหม่มากมาย แต่มีบางอย่างที่ฉันไม่เข้าใจรหัสง่ายๆ: final Stream<Integer>stream = Stream.of(1,2,3,4,5,6,7,8,9,10); stream.flatMap(); javadocs คือ public <R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper) ส่งคืนสตรีมที่ประกอบด้วยผลลัพธ์ของการแทนที่แต่ละองค์ประกอบของสตรีมนี้ด้วยเนื้อหาของสตรีมที่แมปที่สร้างขึ้นโดยใช้ฟังก์ชันการแมปที่ให้มากับแต่ละองค์ประกอบ สตรีมที่แมปแต่ละสตรีมจะถูกปิดหลังจากวางเนื้อหาลงในสตรีมนี้ (หากสตรีมที่แมปเป็นโมฆะจะใช้สตรีมว่างแทน) นี่เป็นการดำเนินการระดับกลาง ฉันอยากจะขอบคุณถ้าใครสร้างตัวอย่างชีวิตจริงบางอย่างง่ายเกี่ยวกับflatMapวิธีการที่คุณสามารถรหัสมันในรุ่นก่อนหน้า Java และวิธีที่คุณสามารถรหัสกิจวัตรเดียวกันโดยใช้Java[6,7]Java 8

6
Java 8 Lambda Expressions - วิธีการหลายอย่างในคลาสที่ซ้อนกัน
ฉันกำลังอ่านเกี่ยวกับคุณสมบัติใหม่ที่: http://www.javaworld.com/article/2078836/java-se/love-and-hate-for-java-8.html ฉันเห็นตัวอย่างด้านล่าง: การใช้คลาส Anonymous: button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { System.out.println("Action Detected"); } }); ด้วย Lambda: button.addActionListener(e -> { System.out.println("Action Detected"); }); บางคนจะทำอย่างไรกับ a MouseListenerถ้าพวกเขาต้องการใช้หลายวิธีในคลาสที่ไม่ระบุตัวตนเช่น public void mousePressed(MouseEvent e) { saySomething("Mouse pressed; # of clicks: " + e.getClickCount(), e); } public void mouseReleased(MouseEvent e) { saySomething("Mouse released; …

4
เหตุใด Java 8 lambda นี้จึงไม่สามารถคอมไพล์ได้
คอมไพล์โค้ด Java ต่อไปนี้ไม่สำเร็จ: @FunctionalInterface private interface BiConsumer<A, B> { void accept(A a, B b); } private static void takeBiConsumer(BiConsumer<String, String> bc) { } public static void main(String[] args) { takeBiConsumer((String s1, String s2) -> new String("hi")); // OK takeBiConsumer((String s1, String s2) -> "hi"); // Error } คอมไพเลอร์รายงาน: Error:(31, 58) …

3
คุณลักษณะเฉพาะของการอนุมานประเภทข้อยกเว้นใน Java 8
ในขณะที่เขียนโค้ดสำหรับคำตอบอื่นบนไซต์นี้ฉันพบลักษณะเฉพาะนี้: static void testSneaky() { final Exception e = new Exception(); sneakyThrow(e); //no problems here nonSneakyThrow(e); //ERRROR: Unhandled exception: java.lang.Exception } @SuppressWarnings("unchecked") static <T extends Throwable> void sneakyThrow(Throwable t) throws T { throw (T) t; } static <T extends Throwable> void nonSneakyThrow(T t) throws T { throw t; } อย่างแรกฉันค่อนข้างสับสนว่าทำไมการsneakyThrowโทรถึงคอมไพเลอร์จึงทำได้ …

3
การจับข้อยกเว้นหลายข้อใน Java-8
ในขณะที่ลองใช้คุณสมบัติมัลติแคปฉันพบว่าm1()วิธีการของฉันทุกอย่างทำงานได้ดีอย่างที่คาดไว้ อย่างไรก็ตามในm2()รหัสเดียวกันไม่ได้รวบรวม ฉันเพิ่งเปลี่ยนไวยากรณ์เพื่อลดจำนวนบรรทัดของรหัส public class Main { public int m1(boolean bool) { try { if (bool) { throw new Excep1(); } throw new Excep2(); //This m1() is compiling abs fine. } catch (Excep1 | Excep2 e) { return 0; } } public int m2(boolean b) { try { throw b …

4
เหตุใดอักขระ char [] ไม่สนับสนุน Arays.stream () เฉพาะอาร์เรย์เท่านั้น
ในขณะที่ทำตามวิธีการแปลงอาร์เรย์ดั้งเดิมเป็นสตรีมฉันพบchar[]ว่าไม่ได้รับการสนับสนุนในขณะที่สนับสนุนประเภทอาร์เรย์ดั้งเดิมอื่น ๆ มีเหตุผลใดที่ทำให้พวกเขาออกจากกระแส?
43 java  java-8 

6
รหัสแฮชของ ArrayList ที่มีตัวมันเองเป็นองค์ประกอบ
เราสามารถหาhashcodeของlistที่มีตัวมันเองเป็นelement? ฉันรู้ว่านี่เป็นวิธีปฏิบัติที่ไม่ดี แต่นี่คือสิ่งที่ผู้สัมภาษณ์ถาม เมื่อฉันรันรหัสต่อไปนี้มันจะพ่น a StackOverflowError: public class Main { public static void main(String args[]) { ArrayList<ArrayList> a = new ArrayList(); a.add(a); a.hashCode(); } } ตอนนี้ที่นี่ฉันมีสองคำถาม: ทำไมถึงมีStackOverflowError? เป็นไปได้ไหมที่จะหารหัสแฮชด้วยวิธีนี้

5
ฉันจะหลีกเลี่ยงการทำซ้ำรหัสเริ่มต้น hashmap ของ hashmap ได้อย่างไร
ลูกค้าทุกคนมีรหัสและใบแจ้งหนี้จำนวนมากที่มีวันที่เก็บไว้เป็น Hashmap ของลูกค้าโดย id ของ hashmap ของใบแจ้งหนี้ตามวันที่: HashMap<LocalDateTime, Invoice> allInvoices = allInvoicesAllClients.get(id); if(allInvoices!=null){ allInvoices.put(date, invoice); //<---REPEATED CODE }else{ allInvoices = new HashMap<>(); allInvoices.put(date, invoice); //<---REPEATED CODE allInvoicesAllClients.put(id, allInvoices); } โซลูชัน Java ดูเหมือนว่าจะใช้getOrDefault: HashMap<LocalDateTime, Invoice> allInvoices = allInvoicesAllClients.getOrDefault( id, new HashMap<LocalDateTime, Invoice> (){{ put(date, invoice); }} ); แต่ถ้ารับไม่เป็นโมฆะฉันยังต้องการใส่ (วันที่ใบแจ้งหนี้) เพื่อดำเนินการและเพิ่มข้อมูลไปที่ "allInvoicesAllClients" …
27 java  java-8  hashmap 

1
เหตุใดจึงไม่ลบ TreeSet ที่มีเครื่องมือเปรียบเทียบที่กำหนดเองเอารายการที่ใหญ่กว่าออก
ใช้ทั้ง Java 8 และ Java 11 ให้พิจารณาสิ่งต่อไปนี้TreeSetกับตัวString::compareToIgnoreCaseเปรียบเทียบ: final Set<String> languages = new TreeSet<>(String::compareToIgnoreCase); languages.add("java"); languages.add("c++"); languages.add("python"); System.out.println(languages); // [c++, java, python] เมื่อฉันพยายามที่จะลบองค์ประกอบที่แน่นอนที่มีอยู่ในTreeSetมันทำงาน: ทั้งหมดที่ระบุจะถูกลบออก: languages.removeAll(Arrays.asList("PYTHON", "C++")); System.out.println(languages); // [java] แต่ถ้าฉันพยายามที่จะเอาแทนมากขึ้นกว่าที่มีอยู่ในTreeSetโทรไม่เอาอะไรเลย (นี้ไม่โทรตามมา แต่เรียกแทนของตัวอย่างด้านบน): languages.removeAll(Arrays.asList("PYTHON", "C++", "LISP")); System.out.println(languages); // [c++, java, python] ผมทำอะไรผิดหรือเปล่า? ทำไมมันทำเช่นนี้? แก้ไข: String::compareToIgnoreCaseเป็นตัวเปรียบเทียบที่ถูกต้อง: (l, r) -> l.compareToIgnoreCase(r)

7
จะสร้างตัวโหลดพื้นหลังบล็อกใน Java 8 ได้อย่างไร?
คำถาม คุณสร้างตัวโหลดพื้นหลังที่เหมาะสมใน Java 8 ได้อย่างไร? เงื่อนไข: ควรโหลดข้อมูลในพื้นหลัง หลังจากการโหลดข้อมูลควรจะปรากฏขึ้น ในขณะที่โหลดข้อมูลไม่จำเป็นต้องยอมรับคำขอใด ๆ เพิ่มเติม หากมีการร้องขอในขณะที่ข้อมูลถูกโหลดอีกครั้งการโหลดควรกำหนดเวลาหลังจากหมดเวลาที่แน่นอน (เช่น 5 วินาที) จุดประสงค์คือเพื่อรับคำขอโหลดซ้ำ แต่ไม่ใช่ฐานข้อมูลที่เต็มไปด้วยคำขอ MCVE นี่คือ MCVE ประกอบด้วยงานพื้นหลังซึ่งจำลองการโหลดโดยเรียกใช้ Thread.sleep เป็นเวลา 2 วินาที งานถูกกำหนดเวลาไว้ทุก ๆ วินาทีซึ่งโดยธรรมชาติจะนำไปสู่การทับซ้อนของงานโหลดพื้นหลังซึ่งควรหลีกเลี่ยง public class LoadInBackgroundExample { /** * A simple background task which should perform the data loading operation. In this minimal example it …

3
การส่งเสริมประเภท Java ในพารามิเตอร์
ฉันสะดุดกับตัวอย่างนี้: public class ParamTest { public static void printSum(int a, double b) { System.out.println("In intDBL " + (a + b)); } public static void printSum(long a, long b) { System.out.println("In long " + (a + b)); } public static void printSum(double a, long b) { System.out.println("In doubleLONG " + (a …

2
ฉันจะข้ามการ จำกัด การโทร (หมายเลข) ด้วยสตรีมได้อย่างไรเมื่อจำนวนเท่ากับ 0
ฉันมีบางรหัส Java itemsที่ให้วัตถุจาก มัน จำกัด พวกเขาตามmaxNumber: items.stream() .map(this::myMapper) .filter(item -> item != null) .limit(maxNumber) .collect(Collectors.toList()); มันทำงานได้ดี แต่คำถามคือ: มีวิธีการข้ามข้อ จำกัด เมื่อmaxNumber == 0? ฉันรู้ว่าฉันสามารถทำสิ่งนี้: if (maxNumber == 0) { items.stream() .map(this::myMapper) .filter(item -> item != null) .collect(Collectors.toList()); } else { items.stream() .map(this::myMapper) .filter(item -> item != null) .limit(maxNumber) .collect(Collectors.toList()); } แต่บางทีอาจจะมีวิธีที่ดีกว่าไม่มีอะไรในใจของคุณ?


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