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

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

9
การตรวจสอบค่าว่างหลายรายการใน Java 8
ฉันมีรหัสด้านล่างซึ่งค่อนข้างน่าเกลียดสำหรับการตรวจสอบค่าว่างหลายรายการ String s = null; if (str1 != null) { s = str1; } else if (str2 != null) { s = str2; } else if (str3 != null) { s = str3; } else { s = str4; } ดังนั้นฉันจึงลองใช้Optional.ofNullablelike ด้านล่าง แต่ก็ยังยากที่จะเข้าใจหากมีคนอ่านรหัสของฉัน วิธีที่ดีที่สุดในการทำเช่นนั้นใน Java 8 คืออะไร String s = …

5
การใช้ Optional.ifPresent () อย่างเหมาะสม
ฉันพยายามเข้าใจifPresent()วิธีการของOptionalAPI ใน Java 8 ฉันมีตรรกะง่ายๆ: Optional<User> user=... user.ifPresent(doSomethingWithUser(user.get())); แต่ส่งผลให้เกิดข้อผิดพลาดในการคอมไพล์: ifPresent(java.util.functionError:(186, 74) java: 'void' type not allowed here) แน่นอนฉันสามารถทำสิ่งนี้ได้: if(user.isPresent()) { doSomethingWithUser(user.get()); } แต่นี่ก็เหมือนกับการnullตรวจสอบที่รกรุงรัง หากฉันเปลี่ยนรหัสเป็นสิ่งนี้: user.ifPresent(new Consumer<User>() { @Override public void accept(User user) { doSomethingWithUser(user.get()); } }); รหัสเริ่มสกปรกขึ้นซึ่งทำให้ฉันคิดว่าจะกลับไปใช้nullเช็คแบบเก่า ความคิดใด ๆ ?
99 java  lambda  java-8  optional 

8
วัตถุประสงค์ของคีย์เวิร์ดเริ่มต้นใน Java คืออะไร?
อินเทอร์เฟซใน Java คล้ายกับคลาส แต่เนื้อหาของอินเทอร์เฟซสามารถมีได้เฉพาะเมธอดนามธรรมและfinalฟิลด์ (ค่าคงที่) เมื่อเร็ว ๆ นี้ฉันเห็นคำถามซึ่งมีลักษณะเช่นนี้ interface AnInterface { public default void myMethod() { System.out.println("D"); } } ตามคำจำกัดความของอินเทอร์เฟซอนุญาตให้ใช้วิธีนามธรรมเท่านั้น ทำไมจึงอนุญาตให้คอมไพล์โค้ดด้านบน? อะไรคือสิ่งที่defaultคำหลัก? ในทางกลับกันเมื่อฉันพยายามเขียนโค้ดด้านล่างมันก็บอกว่า modifier default not allowed here default class MyClass{ } แทน class MyClass { } ใครช่วยบอกจุดประสงค์ของdefaultคีย์เวิร์ดได้ไหม อนุญาตเฉพาะในอินเทอร์เฟซหรือไม่? มันแตกต่างจากdefault(ไม่มีตัวปรับการเข้าถึง) อย่างไร?

5
เหตุใด Collections.sort จึงใช้ Mergesort แต่ Arrays.sort ใช้ไม่ได้
ฉันใช้ JDK-8 (x64) สำหรับArrays.sort(primitives) ฉันพบสิ่งต่อไปนี้ในเอกสาร Java: อัลกอริทึมการเรียงลำดับคือ Dual-Pivot Quicksortโดย Vladimir Yaroslavskiy, Jon Bentley และ Joshua Bloch สำหรับCollections.sort(วัตถุ) ฉันพบ "Timsort" นี้: การนำไปใช้งานนี้เป็นการผสานแบบวนซ้ำที่เสถียรและปรับเปลี่ยนได้... การนำไปใช้งานนี้จะทิ้งรายการที่ระบุลงในอาร์เรย์จัดเรียงอาร์เรย์และวนซ้ำในรายการที่รีเซ็ตแต่ละองค์ประกอบจากตำแหน่งที่สอดคล้องกันในอาร์เรย์ ถ้าCollections.sortใช้อาร์เรย์ทำไมไม่ได้เพียงโทรArrays.sortหรือใช้แบบ dual-เดือยQuickSort ? ทำไมต้องใช้Mergesort ?

6
เปลี่ยน Java Future ให้เป็น CompletableFuture
Java 8 แนะนำCompletableFutureการใช้งาน Future ใหม่ที่สามารถใช้ร่วมกันได้ (รวมถึงวิธีการ Xxx จำนวนมาก) ฉันต้องการใช้สิ่งนี้โดยเฉพาะ แต่หลาย ๆ ไลบรารีที่ฉันต้องการใช้จะส่งคืนเฉพาะFutureอินสแตนซ์ที่ไม่สามารถประกอบได้ มีวิธีการรวมFutureอินสแตนซ์ที่ส่งคืนภายใน a CompleteableFutureเพื่อที่ฉันจะเขียนมันได้หรือไม่
97 java  java-8  future 

4
ตัวรวบรวมขยะดีฟอลต์สำหรับ Java 8
ตัวรวบรวมขยะเริ่มต้นสำหรับ Java 8 คืออะไร? เมื่อฉันตรวจสอบ JMX Beans พวกเขาเปิดเผยว่าเป็นตัวสะสมคู่ขนานสำหรับคนรุ่นใหม่และตัวเก็บอนุกรมรุ่นเก่าสำหรับคนรุ่นเก่า

5
เหตุใดฉันจึงไม่สามารถแมปเลขจำนวนเต็มกับสตริงเมื่อสตรีมจากอาร์เรย์ได้
รหัสนี้ใช้งานได้ (ถ่ายใน Javadoc): List<Integer> numbers = Arrays.asList(1, 2, 3, 4); String commaSeparatedNumbers = numbers.stream() .map(i -> i.toString()) .collect(Collectors.joining(", ")); ไม่สามารถรวบรวมสิ่งนี้ได้: int[] numbers = {1, 2, 3, 4}; String commaSeparatedNumbers = Arrays.stream(numbers) .map((Integer i) -> i.toString()) .collect(Collectors.joining(", ")); IDEA บอกฉันว่าฉันมี "สตริงประเภทการส่งคืนที่ไม่เข้ากันในนิพจน์แลมบ์ดา" ทำไม? และจะแก้ไขอย่างไร?

1
completefuture join vs get
อะไรคือความแตกต่างระหว่างCompletableFuture.get()และCompletableFuture.join()? ด้านล่างนี้คือรหัสของฉัน: List<String> process() { List<String> messages = Arrays.asList("Msg1", "Msg2", "Msg3", "Msg4", "Msg5", "Msg6", "Msg7", "Msg8", "Msg9", "Msg10", "Msg11", "Msg12"); MessageService messageService = new MessageService(); ExecutorService executor = Executors.newFixedThreadPool(4); List<String> mapResult = new ArrayList<>(); CompletableFuture<?>[] fanoutRequestList = new CompletableFuture[messages.size()]; int count = 0; for (String msg : messages) { CompletableFuture<?> …

8
จัดกลุ่มตามชื่อเขตข้อมูลหลายชื่อใน java 8
ฉันพบรหัสสำหรับจัดกลุ่มวัตถุตามชื่อเขตข้อมูลจาก POJO ด้านล่างนี้คือรหัสสำหรับสิ่งนั้น: public class Temp { static class Person { private String name; private int age; private long salary; Person(String name, int age, long salary) { this.name = name; this.age = age; this.salary = salary; } @Override public String toString() { return String.format("Person{name='%s', age=%d, salary=%d}", name, age, salary); } …
95 java  java-8 

3
_ (ขีดล่าง) เป็นคำหลักที่สงวนไว้
ฉันเพิ่งแทนที่sนิพจน์แลมบ์ดาต่อไปนี้โดย_: s -> Integer.parseInt(s) คอมไพเลอร์ Eclipse พูดว่า: ไม่ควรใช้ '_' เป็นตัวระบุเนื่องจากเป็นคำหลักที่สงวนไว้ตั้งแต่ระดับแหล่งที่มา 1.8 ฉันไม่พบคำอธิบายใด ๆ ในโครงสร้างศัพท์ / คำหลักJLS §3.9
94 java  lambda  java-8 

6
ใน Java 8 เหตุใดความจุเริ่มต้นของ ArrayList จึงเป็นศูนย์
อย่างที่ฉันจำได้ก่อน Java 8 ความจุเริ่มต้นArrayListคือ 10 น่าแปลกที่ความคิดเห็นเกี่ยวกับตัวสร้างเริ่มต้น (โมฆะ) ยังคงระบุว่า: Constructs an empty list with an initial capacity of ten. จากArrayList.java: /** * Shared empty array instance used for default sized empty instances. We * distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when * first element is added. */ …
94 java  arraylist  java-8 

6
การใช้งาน HashMap Java 8
ตามเอกสารลิงค์ต่อไปนี้: การใช้งาน Java HashMap ฉันสับสนกับการใช้งานHashMap(หรือมากกว่านั้นคือการเพิ่มประสิทธิภาพในHashMap) คำถามของฉันคือ: ประการแรก static final int TREEIFY_THRESHOLD = 8; static final int UNTREEIFY_THRESHOLD = 6; static final int MIN_TREEIFY_CAPACITY = 64; เหตุใดจึงใช้ค่าคงที่เหล่านี้และอย่างไร ฉันต้องการตัวอย่างที่ชัดเจนสำหรับเรื่องนี้ พวกเขาได้รับประสิทธิภาพที่เพิ่มขึ้นจากสิ่งนี้อย่างไร? ประการที่สอง หากคุณเห็นซอร์สโค้ดของHashMapใน JDK คุณจะพบคลาสภายในแบบคงที่ต่อไปนี้: static final class TreeNode<K, V> extends java.util.LinkedHashMap.Entry<K, V> { HashMap.TreeNode<K, V> parent; HashMap.TreeNode<K, V> left; HashMap.TreeNode<K, V> right; …


4
อินเทอร์เฟซที่มีวิธีการเริ่มต้นเริ่มต้นเมื่อใด
ในขณะที่ค้นหาข้อมูลจำเพาะภาษา Java เพื่อตอบคำถามนี้ฉันได้เรียนรู้สิ่งนั้น ก่อนที่คลาสจะเริ่มต้นจะต้องเริ่มต้นคลาสซูเปอร์คลาสโดยตรงแต่อินเทอร์เฟซที่ใช้โดยคลาสจะไม่ถูกเตรียมใช้งาน ในทำนองเดียวกัน superinterfaces ของอินเทอร์เฟซจะไม่ถูกเตรียมใช้งานก่อนที่อินเทอร์เฟซจะเริ่มต้น เพื่อความอยากรู้อยากเห็นของฉันเองฉันลองใช้แล้วและตามที่คาดไว้อินเทอร์เฟซInterfaceTypeไม่ได้เริ่มต้น public class Example { public static void main(String[] args) throws Exception { InterfaceType foo = new InterfaceTypeImpl(); foo.method(); } } class InterfaceTypeImpl implements InterfaceType { @Override public void method() { System.out.println("implemented method"); } } class ClassInitializer { static { System.out.println("static initializer"); } …

27
ข้อผิดพลาดของคีย์รีจิสทรี: เวอร์ชัน Java มีค่า '1.8' แต่จำเป็นต้องมี '1.7'
ขณะวิ่ง sencha app build production ฉันได้รับข้อผิดพลาดต่อไปนี้: ข้อผิดพลาด: คีย์รีจิสทรี 'Software \ JavaSoft \ Java Runtime Environment' \ CurrentVersion ' มีค่า '1.8' แต่ต้องระบุ '1.7' ข้อผิดพลาด: ไม่พบข้อผิดพลาด java.dll: ไม่พบ Java SE Runtime Environment java -version คำสั่งแสดงดังต่อไปนี้: เวอร์ชัน java "1.8.0_40" Java (TM) SE Runtime Environment (build 1.8.0_40-b26) Java HotSpot (TM) 64-Bit Server VM (build …

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