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

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

2
ในตัว Java 8 เพรดิเคตที่คืนค่าจริงเสมอ?
Google ฝรั่งมีกริยาที่ผลตอบแทนเสมอ trueJava 8 มีบางอย่างที่คล้ายกันPredicateหรือไม่? ฉันรู้ว่าฉันสามารถใช้แต่ฉันต้องการบางสิ่งบางอย่างที่ทำไว้ล่วงหน้าเพื่อที่คล้ายคลึงกัน(foo)->{return true;}Collections.emptySet()
130 java  lambda  java-8  predicate 

5
การอัพเกรดโค้ดที่คอมไพล์ Java 7 เป็น Java 8 มีประโยชน์หรือไม่?
ฉันมีแอปพลิเคชันเก่าที่เขียนโดยใช้ Java 7 มันทำงานได้ดีใน Java 8 JRE ฉันไม่ได้วางแผนที่จะเขียนโค้ดใหม่เพื่อใช้ประโยชน์จากคุณสมบัติ Java 8 มีประโยชน์ทางเทคนิคในการอัพเกรดโค้ดที่คอมไพล์แล้วเป็น Java 8 JDK ล่าสุดหรือไม่? เพื่อความชัดเจนขณะนี้โค้ดถูกคอมไพล์ด้วย Java 7 และรันด้วย Java 8 JRE ล่าสุดแล้ว ควรได้รับประโยชน์จากการปรับปรุงรันไทม์ Java 8 อยู่แล้ว คำถามนี้คือประโยชน์ที่จะได้รับจากการคอมไพล์ด้วยเวอร์ชัน 8 และรันด้วยโค้ดไบต์คอมไพล์ Java 8 หรือไม่ นอกจากนี้ฉันไม่ได้กังวลกับผลประโยชน์ที่ไม่ใช่ทางเทคนิคเช่นประสิทธิภาพการทำงานของนักพัฒนา ฉันคิดว่าสิ่งเหล่านี้สำคัญ แต่ไม่ใช่ประเด็นของคำถามนี้ ฉันขอเห็นแก่รหัสการผลิตที่ไม่มีทีมพัฒนา อยู่ในโหมดการบำรุงรักษาอย่างหมดจด
127 java  performance  java-8 


4
ย้ายไปยังรายการถัดไปโดยใช้ Java 8 foreach loop ในสตรีม
ฉันมีปัญหากับสตรีมของ Java 8 foreach ที่พยายามย้ายรายการถัดไปแบบวนซ้ำ ฉันไม่สามารถตั้งค่าคำสั่งเช่นcontinue;ใช้return;งานได้ แต่คุณจะออกจากลูปในกรณีนี้ ฉันต้องไปยังรายการถัดไปแบบวนซ้ำ ฉันจะทำเช่นนั้นได้อย่างไร? ตัวอย่าง (ไม่ทำงาน): try(Stream<String> lines = Files.lines(path, StandardCharsets.ISO_8859_1)){ filteredLines = lines.filter(...).foreach(line -> { ... if(...) continue; // this command doesn't working here }); } ตัวอย่าง (ที่ทำงาน): try(Stream<String> lines = Files.lines(path, StandardCharsets.ISO_8859_1)){ filteredLines = lines.filter(...).collect(Collectors.toList()); } for(String filteredLine : filteredLines){ ... if(...) continue; …
127 java  java-8 

1
ทำไม ZoneOffset.UTC! = ZoneId.of (“ UTC”)
ทำไม ZonedDateTime now = ZonedDateTime.now(); System.out.println(now.withZoneSameInstant(ZoneOffset.UTC) .equals(now.withZoneSameInstant(ZoneId.of("UTC")))); พิมพ์ออกมาfalse? ฉันคาดหวังว่าทั้งสองZonedDateTimeอินสแตนซ์จะเท่ากัน

3
ดึงองค์ประกอบแรกที่ตรงกับเกณฑ์
วิธีรับองค์ประกอบแรกที่ตรงกับเกณฑ์ในสตรีม ฉันได้ลองแล้ว แต่ไม่ได้ผล this.stops.stream().filter(Stop s-> s.getStation().getName().equals(name)); เกณฑ์นั้นไม่ทำงานวิธีการกรองจะถูกเรียกใช้ในคลาสอื่นที่ไม่ใช่ Stop public class Train { private final String name; private final SortedSet<Stop> stops; public Train(String name) { this.name = name; this.stops = new TreeSet<Stop>(); } public void addStop(Stop stop) { this.stops.add(stop); } public Stop getFirstStation() { return this.getStops().first(); } public Stop getLastStation() { …
122 java  java-8  java-stream 

10
คัดลอกสตรีมเพื่อหลีกเลี่ยง "สตรีมได้รับการดำเนินการแล้วหรือปิด"
ฉันต้องการทำสตรีม Java 8 ซ้ำเพื่อที่ฉันจะได้จัดการกับมันสองครั้ง ฉันสามารถcollectเป็นรายการและรับสตรีมใหม่จากสิ่งนั้น // doSomething() returns a stream List<A> thing = doSomething().collect(toList()); thing.stream()... // do stuff thing.stream()... // do other stuff แต่ฉันคิดว่าควรมีวิธีที่มีประสิทธิภาพ / สง่างามกว่านี้ มีวิธีคัดลอกสตรีมโดยไม่เปลี่ยนเป็นคอลเล็กชันหรือไม่? ฉันกำลังทำงานกับสตรีมของEithers จริงๆดังนั้นต้องการประมวลผลการฉายภาพด้านซ้ายทางเดียวก่อนที่จะย้ายไปยังการฉายภาพด้านขวาและจัดการด้วยวิธีอื่น แบบนี้ (ซึ่งจนถึงตอนนี้ฉันบังคับให้ใช้toListเคล็ดลับด้วย) List<Either<Pair<A, Throwable>, A>> results = doSomething().collect(toList()); Stream<Pair<A, Throwable>> failures = results.stream().flatMap(either -> either.left()); failures.forEach(failure -> ... ); Stream<A> successes …

3
ฟอร์แมต LocalDateTime ด้วย Timezone ใน Java8
ฉันมีรหัสง่ายๆนี้: DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss.SSSSSS Z"); LocalDateTime.now().format(FORMATTER) จากนั้นฉันจะได้รับข้อยกเว้นดังต่อไปนี้: java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: OffsetSeconds at java.time.LocalDate.get0(LocalDate.java:680) at java.time.LocalDate.getLong(LocalDate.java:659) at java.time.LocalDateTime.getLong(LocalDateTime.java:720) at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298) at java.time.format.DateTimeFormatterBuilder$OffsetIdPrinterParser.format(DateTimeFormatterBuilder.java:3315) at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2182) at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1745) at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1719) at java.time.LocalDateTime.format(LocalDateTime.java:1746) จะแก้ไขปัญหานี้ได้อย่างไร?
121 java  java-8  java-time 

9
แลมบ์ดานิพจน์มีประโยชน์นอกเหนือจากการบันทึกบรรทัดของโค้ดหรือไม่
แลมบ์ดานิพจน์มีประโยชน์นอกเหนือจากการบันทึกบรรทัดของโค้ดหรือไม่ lambdas มีคุณสมบัติพิเศษใดบ้างที่ช่วยแก้ปัญหาที่แก้ได้ไม่ยาก? การใช้งานทั่วไปที่ฉันเห็นคือแทนที่จะเขียนสิ่งนี้: Comparator<Developer> byName = new Comparator<Developer>() { @Override public int compare(Developer o1, Developer o2) { return o1.getName().compareTo(o2.getName()); } }; เราสามารถใช้นิพจน์แลมบ์ดาเพื่อย่อโค้ด: Comparator<Developer> byName = (Developer o1, Developer o2) -> o1.getName().compareTo(o2.getName());
120 java  lambda  java-8 

6
รับองค์ประกอบสุดท้ายของสตรีม / รายการในซับเดียว
ฉันจะรับองค์ประกอบสุดท้ายของสตรีมหรือรายการในรหัสต่อไปนี้ได้อย่างไร ที่ไหนdata.careasเป็นList<CArea>: CArea first = data.careas.stream() .filter(c -> c.bbox.orientationHorizontal).findFirst().get(); CArea last = data.careas.stream() .filter(c -> c.bbox.orientationHorizontal) .collect(Collectors.toList()).; //how to? อย่างที่คุณเห็นการรับองค์ประกอบแรกด้วยองค์ประกอบบางอย่างfilterไม่ใช่เรื่องยาก อย่างไรก็ตามการได้รับองค์ประกอบสุดท้ายในหนึ่งซับเป็นความเจ็บปวดอย่างแท้จริง: ดูเหมือนว่าฉันไม่สามารถรับได้โดยตรงจากไฟล์Stream. (มันจะสมเหตุสมผลสำหรับสตรีมที่ จำกัด เท่านั้น) ดูเหมือนว่าคุณไม่สามารถรับสิ่งต่างๆเช่นfirst()และlast()จากListอินเทอร์เฟซได้ซึ่งเป็นความเจ็บปวดจริงๆ ฉันไม่เห็นอาร์กิวเมนต์ใด ๆ ที่ไม่ให้ a first()และlast()method ในListอินเทอร์เฟซเนื่องจากองค์ประกอบในนั้นได้รับคำสั่งและยิ่งกว่านั้นขนาดก็เป็นที่รู้จัก แต่ตามคำตอบเดิม: จะได้รับองค์ประกอบสุดท้ายของ จำกัด ได้Streamอย่างไร? โดยส่วนตัวแล้วนี่เป็นสิ่งที่ใกล้เคียงที่สุดที่ฉันจะได้รับ: int lastIndex = data.careas.stream() .filter(c -> c.bbox.orientationHorizontal) .mapToInt(c -> data.careas.indexOf(c)).max().getAsInt(); CArea last = …
119 java  list  java-8  java-stream 

4
CompletableFuture | จากนั้นใช้เทียบกับแล้ว
ฉันไม่สามารถเข้าใจความแตกต่างระหว่างthenApply() และthenCompose(). แล้วใครช่วยให้กรณีการใช้งานที่ถูกต้อง? จากเอกสาร Java: thenApply(Function<? super T,? extends U> fn) ส่งคืนค่าใหม่CompletionStageที่เมื่อขั้นตอนนี้เสร็จสิ้นตามปกติจะถูกดำเนินการด้วยผลลัพธ์ของสเตจนี้เป็นอาร์กิวเมนต์ของฟังก์ชันที่ให้มา thenCompose(Function<? super T,? extends CompletionStage<U>> fn) ส่งคืนค่าใหม่CompletionStageที่เมื่อขั้นตอนนี้เสร็จสิ้นตามปกติจะถูกดำเนินการด้วยสเตจนี้เป็นอาร์กิวเมนต์ของฟังก์ชันที่ให้มา ฉันเข้าใจว่าอาร์กิวเมนต์ที่ 2 ของการthenComposeขยาย CompletionStage โดยที่thenApplyไม่ได้ มีใครช่วยยกตัวอย่างได้ไหมว่าฉันต้องใช้ในกรณีใดthenApplyและเมื่อthenComposeใด

3
จัดรูปแบบวันที่โดยใช้วันที่และเวลาใหม่ API
ฉันกำลังเล่นกับวันที่เวลาใหม่ API แต่เมื่อเรียกใช้สิ่งนี้: public class Test { public static void main(String[] args){ String dateFormatted = LocalDate.now() .format(DateTimeFormatter .ofPattern("yyyy-MM-dd HH:mm:ss")); System.out.println(dateFormatted); } } มันพ่น: Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: HourOfDay at java.time.LocalDate.get0(LocalDate.java:680) at java.time.LocalDate.getLong(LocalDate.java:659) at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298) at java.time.format.DateTimeFormatterBuilder$NumberPrinterParser.format(DateTimeFormatterBuilder.java:2543) at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2182) at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1745) at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1719) at java.time.LocalDate.format(LocalDate.java:1685) at Test.main(Test.java:23) เมื่อดูซอร์สโค้ดของคลาส …

6
แลมบ์ดาที่มีลูกศร 2 ตัวใน Java 8 หมายถึงอะไร
ฉันเคยอ่านบทแนะนำ Java 8 มาแล้วหลายครั้ง ตอนนี้ฉันพบหัวข้อต่อไปนี้: java รองรับ Currying หรือไม่? ที่นี่ฉันเห็นรหัสต่อไปนี้: IntFunction<IntUnaryOperator> curriedAdd = a -> b -> a + b; System.out.println(curriedAdd.apply(1).applyAsInt(12)); ฉันเข้าใจว่าตัวอย่างนี้รวม 2 องค์ประกอบ แต่ฉันไม่เข้าใจโครงสร้าง: a -> b -> a + b; ตามส่วนซ้ายของนิพจน์แถวนี้ควรใช้ฟังก์ชันต่อไปนี้: R apply(int value); ก่อนหน้านี้ฉันได้พบกับลูกศรเพียงลูกเดียวเท่านั้น
118 java  lambda  java-8  currying 

3
PermGen กับ Metaspace ต่างกันอย่างไร?
จนกระทั่ง Java 7 มีพื้นที่ในหน่วยความจำ JVM ที่เรียกว่าPermGenซึ่ง JVM ใช้เพื่อเก็บคลาสไว้ ในJava 8มันถูกลบออกไปและแทนที่ด้วยพื้นที่ที่เรียกว่าMetaspace อะไรคือความแตกต่างที่สำคัญที่สุดระหว่าง PermGen และ Metaspace? ข้อแตกต่างเดียวที่ฉันรู้คือjava.lang.OutOfMemoryError: PermGen spaceไม่สามารถโยนได้อีกต่อไปและพารามิเตอร์ VM MaxPermSizeจะถูกละเว้น

3
วิธีตรวจสอบว่าองค์ประกอบมีอยู่โดยใช้นิพจน์แลมบ์ดาหรือไม่?
โดยเฉพาะฉันมี TabPane และฉันต้องการทราบว่ามีองค์ประกอบที่มี ID เฉพาะอยู่หรือไม่ ดังนั้นฉันต้องการทำสิ่งนี้ด้วยแลมบ์ดานิพจน์ใน Java: boolean idExists = false; String idToCheck = "someId"; for (Tab t : tabPane.getTabs()){ if(t.getId().equals(idToCheck)) { idExists = true; } }
118 java  java-8  lambda 

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