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

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

5
Java 8 เป็นวิธีที่ดีในการทำซ้ำค่าหรือฟังก์ชันหรือไม่?
ในภาษาอื่น ๆ อีกมากมายเช่น Haskell เป็นเรื่องง่ายที่จะทำซ้ำค่าหรือฟังก์ชันหลาย ๆ ครั้งเช่น เพื่อรับรายการ 8 สำเนาของค่า 1: take 8 (repeat 1) แต่ฉันยังไม่พบสิ่งนี้ใน Java 8 มีฟังก์ชันดังกล่าวใน JDK ของ Java 8 หรือไม่? หรืออีกทางเลือกหนึ่งที่เทียบเท่ากับช่วงเช่น [1..8] ดูเหมือนว่าจะแทนที่คำสั่ง verbose ใน Java ได้อย่างชัดเจนเช่น for (int i = 1; i <= 8; i++) { System.out.println(i); } จะมีบางอย่างเช่น Range.from(1, 8).forEach(i -> System.out.println(i)) แม้ว่าตัวอย่างนี้จะดูไม่กระชับเท่าไหร่นัก ... …
118 java  java-8 

1
วิธีการเริ่มต้น Java 8 เป็นลักษณะ: ปลอดภัยหรือไม่
วิธีปฏิบัติที่ปลอดภัยในการใช้ วิธีการเริ่มต้นเป็นลักษณะเฉพาะของคนยากจนใน Java 8 หรือไม่? บางคนอ้างว่ามันอาจทำให้แพนด้าเสียใจหากคุณใช้มันเพียงเพื่อประโยชน์ของมันเพราะมันเจ๋ง แต่นั่นไม่ใช่ความตั้งใจของฉัน นอกจากนี้ยังมักจะได้รับการเตือนว่ามีการแนะนำวิธีการเริ่มต้นเพื่อสนับสนุนการพัฒนา API และความเข้ากันได้แบบย้อนหลังซึ่งเป็นความจริง แต่สิ่งนี้ไม่ได้ทำให้ผิดหรือบิดเบี้ยวในการใช้เป็นลักษณะเฉพาะ ฉันมีกรณีการใช้งานจริงดังต่อไปนี้ : public interface Loggable { default Logger logger() { return LoggerFactory.getLogger(this.getClass()); } } หรือบางทีกำหนดPeriodTrait: public interface PeriodeTrait { Date getStartDate(); Date getEndDate(); default isValid(Date atDate) { ... } } เป็นที่ยอมรับว่าสามารถใช้องค์ประกอบ (หรือแม้แต่คลาสตัวช่วย) แต่ดูเหมือนว่าจะดูละเอียดและรกกว่าและไม่อนุญาตให้ได้รับประโยชน์จากความหลากหลาย ดังนั้นการใช้วิธีการเริ่มต้นเป็นลักษณะพื้นฐานเป็นเรื่องปกติหรือไม่ปกติหรือไม่หรือฉันควรกังวลเกี่ยวกับผลข้างเคียงที่คาดไม่ถึง? หลายคำถามเกี่ยวกับ SO เกี่ยวข้องกับลักษณะ Java และ …

6
วิธีการดีบักสตรีม () แผนที่ (…) ด้วยนิพจน์แลมบ์ดา
ในโครงการของเราเรากำลังย้ายไปที่ java 8 และเรากำลังทดสอบคุณสมบัติใหม่ของมัน ในโครงการของฉันฉันใช้ภาคฝรั่งและฟังก์ชั่นในการกรองและการแปลงคอลเลกชันโดยใช้และCollections2.transformCollections2.filter ในการย้ายข้อมูลนี้ฉันจำเป็นต้องเปลี่ยนเช่น guava code เป็น java 8 การเปลี่ยนแปลง ดังนั้นการเปลี่ยนแปลงที่ฉันทำคือประเภทของ: List<Integer> naturals = Lists.newArrayList(1,2,3,4,5,6,7,8,9,10,11,12,13); Function <Integer, Integer> duplicate = new Function<Integer, Integer>(){ @Override public Integer apply(Integer n) { return n * 2; } }; Collection result = Collections2.transform(naturals, duplicate); ถึง... List<Integer> result2 = naturals.stream() .map(n -> n …
115 java  debugging  lambda  java-8 

4
ฉันจะใช้ฟังก์ชัน computeIfAbsent ใหม่ได้อย่างไร
ฉันต้องการใช้Map.computeIfAbsentเป็นอย่างมากแต่มันนานเกินไปแล้วตั้งแต่ lambdas อยู่ในระดับปริญญาตรี เกือบจะโดยตรงจากเอกสาร: มันเป็นตัวอย่างของวิธีการทำสิ่งต่างๆแบบเก่า: Map<String, Boolean> whoLetDogsOut = new ConcurrentHashMap<>(); String key = "snoop"; if (whoLetDogsOut.get(key) == null) { Boolean isLetOut = tryToLetOut(key); if (isLetOut != null) map.putIfAbsent(key, isLetOut); } และวิธีใหม่: map.computeIfAbsent(key, k -> new Value(f(k))); แต่ในตัวอย่างของพวกเขาฉันคิดว่าฉันไม่ค่อย "เข้าใจ" ฉันจะแปลงรหัสเพื่อใช้วิธีแลมด้าใหม่ในการแสดงสิ่งนี้ได้อย่างไร

11
การแก้ไขตัวแปรโลคัลจากภายในแลมด้า
การแก้ไขตัวแปรภายในforEachทำให้เกิดข้อผิดพลาดในการคอมไพล์: ปกติ int ordinal = 0; for (Example s : list) { s.setOrdinal(ordinal); ordinal++; } ด้วยแลมด้า int ordinal = 0; list.forEach(s -> { s.setOrdinal(ordinal); ordinal++; }); มีความคิดอย่างไรในการแก้ไขปัญหานี้
115 java  lambda  java-8 

12
รูปแบบ JSON Java 8 LocalDateTime ใน Spring Boot
ฉันมีปัญหาเล็กน้อยกับการฟอร์แมต Java 8 LocalDateTime ใน Spring Boot Application ด้วยวันที่ 'ปกติ' ฉันไม่มีปัญหา แต่ฟิลด์ LocalDateTime จะถูกแปลงเป็นดังต่อไปนี้: "startDate" : { "year" : 2010, "month" : "JANUARY", "dayOfMonth" : 1, "dayOfWeek" : "FRIDAY", "dayOfYear" : 1, "monthValue" : 1, "hour" : 2, "minute" : 2, "second" : 0, "nano" : 0, "chronology" : { …

2
นิพจน์แลมบ์ดาเทียบกับการอ้างอิงเมธอด [ปิด]
ปิด . คำถามนี้เป็นคำถามความคิดเห็นตาม ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบได้ด้วยข้อเท็จจริงและการอ้างอิงโดยแก้ไขโพสต์นี้ ปิดให้บริการใน6 ปีที่ผ่านมา ปรับปรุงคำถามนี้ IntelliJ ยังคงเสนอให้ฉันแทนที่นิพจน์แลมบ์ดาด้วยการอ้างอิงวิธีการ มีวัตถุประสงค์แตกต่างกันระหว่างทั้งสองอย่างหรือไม่?

4
ตัวดำเนินการที่เกี่ยวข้องกับ Java เทียบกับ if / else ในความเข้ากันได้ <JDK8
เมื่อเร็ว ๆ นี้ฉันกำลังอ่านซอร์สโค้ดของ Spring Framework มีบางอย่างที่ฉันไม่เข้าใจอยู่ที่นี่: public Member getMember() { // NOTE: no ternary expression to retain JDK &lt;8 compatibility even when using // the JDK 8 compiler (potentially selecting java.lang.reflect.Executable // as common type, with that new base class not available on older JDKs) if (this.method != null) { …

7
Java 8: TriFunction (และ kin) ใน java.util.function อยู่ที่ไหน หรือมีทางเลือกอย่างไร?
ฉันเห็น java.util.function.BiFunction ดังนั้นฉันจึงสามารถทำได้: BiFunction&lt;Integer, Integer, Integer&gt; f = (x, y) -&gt; { return 0; }; จะเกิดอะไรขึ้นถ้าสิ่งนั้นไม่ดีพอและฉันต้องการ TriFunction? มันไม่มี! TriFunction&lt;Integer, Integer, Integer, Integer&gt; f = (x, y, z) -&gt; { return 0; }; ฉันเดาว่าฉันควรเพิ่มว่าฉันรู้ว่าฉันสามารถกำหนด TriFunction ของตัวเองได้ฉันแค่พยายามเข้าใจเหตุผลเบื้องหลังโดยไม่รวมไว้ในไลบรารีมาตรฐาน
113 java  lambda  java-8 

10
นิพจน์แลมบ์ดาเพื่อแปลงอาร์เรย์ / รายการสตริงเป็นอาร์เรย์ / รายการจำนวนเต็ม
เนื่องจาก Java 8 มาพร้อมกับนิพจน์แลมด้าอันทรงพลัง ฉันต้องการเขียนฟังก์ชันเพื่อแปลง List / array ของ Strings เป็น array / List of Integers, Floats, Doubles ฯลฯ .. ใน Java ปกติมันจะง่ายพอ ๆ กับ for(String str : strList){ intList.add(Integer.valueOf(str)); } แต่ฉันจะบรรลุสิ่งเดียวกันกับแลมด้าได้อย่างไรโดยกำหนดอาร์เรย์ของสตริงที่จะแปลงเป็นอาร์เรย์ของจำนวนเต็ม

2
Comparator.reversed () ไม่รวบรวมโดยใช้ lambda
ฉันมีรายการที่มีวัตถุผู้ใช้บางอย่างและฉันกำลังพยายามจัดเรียงรายการ แต่ใช้งานได้โดยใช้การอ้างอิงวิธีการเท่านั้นด้วยนิพจน์แลมบ์ดาคอมไพเลอร์ให้ข้อผิดพลาด: List&lt;User&gt; userList = Arrays.asList(u1, u2, u3); userList.sort(Comparator.comparing(u -&gt; u.getName())); // works userList.sort(Comparator.comparing(User::getName).reversed()); // works userList.sort(Comparator.comparing(u -&gt; u.getName()).reversed()); // Compiler error ข้อผิดพลาด: com\java8\collectionapi\CollectionTest.java:35: error: cannot find symbol userList.sort(Comparator.comparing(u -&gt; u.getName()).reversed()); ^ symbol: method getName() location: variable u of type Object 1 error

7
Java8 Lambdas เทียบกับคลาส Anonymous
เนื่องจาก Java8 ได้รับการเผยแพร่เมื่อไม่นานมานี้และนิพจน์แลมบ์ดาใหม่เอี่ยมนั้นดูดีมากฉันสงสัยว่านี่หมายถึงการตายของคลาส Anonymous ที่เราคุ้นเคยหรือไม่ ฉันได้ค้นคว้าข้อมูลเล็กน้อยเกี่ยวกับเรื่องนี้และพบตัวอย่างที่น่าสนใจเกี่ยวกับวิธีที่นิพจน์แลมบ์ดาจะแทนที่คลาสเหล่านั้นอย่างเป็นระบบเช่นวิธีการจัดเรียงของคอลเลคชันซึ่งเคยได้รับอินสแตนซ์ของตัวเปรียบเทียบแบบไม่ระบุชื่อเพื่อทำการจัดเรียง: Collections.sort(personList, new Comparator&lt;Person&gt;(){ public int compare(Person p1, Person p2){ return p1.firstName.compareTo(p2.firstName); } }); ตอนนี้สามารถทำได้โดยใช้ Lambdas: Collections.sort(personList, (Person p1, Person p2) -&gt; p1.firstName.compareTo(p2.firstName)); และดูกระชับอย่างน่าประหลาด. คำถามของฉันคือมีเหตุผลอะไรที่จะใช้คลาสเหล่านั้นใน Java8 แทน Lambdas ต่อไปหรือไม่? แก้ไข คำถามเดียวกัน แต่ในทางตรงกันข้ามประโยชน์ของการใช้ Lambdas แทนคลาส Anonymous คืออะไรเนื่องจาก Lambdas สามารถใช้ได้กับอินเทอร์เฟซวิธีการเดียวเท่านั้นคุณลักษณะใหม่นี้เป็นเพียงทางลัดที่ใช้ในบางกรณีเท่านั้นหรือมีประโยชน์จริงหรือไม่

4
Lambda Expression และวิธีการทั่วไป
สมมติว่าฉันมีอินเทอร์เฟซทั่วไป: interface MyComparable&lt;T extends Comparable&lt;T&gt;&gt; { public int compare(T obj1, T obj2); } และวิธีการsort: public static &lt;T extends Comparable&lt;T&gt;&gt; void sort(List&lt;T&gt; list, MyComparable&lt;T&gt; comp) { // sort the list } ฉันสามารถเรียกใช้วิธีนี้และส่งนิพจน์แลมบ์ดาเป็นอาร์กิวเมนต์: List&lt;String&gt; list = Arrays.asList("a", "b", "c"); sort(list, (a, b) -&gt; a.compareTo(b)); ที่จะทำงานได้ดี แต่ตอนนี้ถ้าฉันทำให้อินเทอร์เฟซไม่ใช่แบบทั่วไปและวิธีการทั่วไป: interface MyComparable { public &lt;T extends …
111 java  generics  lambda  java-8 

3
เหตุใดใน Java 8 แยกบางครั้งจึงลบสตริงว่างเมื่อเริ่มต้นอาร์เรย์ผลลัพธ์
ก่อน Java 8เมื่อเราแยกสตริงว่างเช่น String[] tokens = "abc".split(""); กลไกการแยกจะแยกในสถานที่ที่มีเครื่องหมาย | |a|b|c| เนื่องจาก""มีพื้นที่ว่างก่อนและหลังอักขระแต่ละตัว ดังนั้นผลลัพธ์มันจะสร้างอาร์เรย์นี้ในตอนแรก ["", "a", "b", "c", ""] และต่อมาจะลบสตริงว่างต่อท้าย (เนื่องจากเราไม่ได้ระบุค่าลบให้กับlimitอาร์กิวเมนต์อย่างชัดเจน) ดังนั้นในที่สุดก็จะคืนค่า ["", "a", "b", "c"] ในกลไกการแบ่งJava 8ดูเหมือนจะเปลี่ยนไป ทีนี้เมื่อเราใช้ "abc".split("") เราจะได้["a", "b", "c"]อาร์เรย์แทน["", "a", "b", "c"]ดังนั้นดูเหมือนว่าสตริงว่างเมื่อเริ่มต้นจะถูกลบออกไปด้วย แต่ทฤษฎีนี้ล้มเหลวเพราะตัวอย่างเช่น "abc".split("a") ["", "bc"]ส่งกลับอาร์เรย์กับสตริงที่ว่างเปล่าในช่วงเริ่มต้น ใครช่วยอธิบายได้ว่าเกิดอะไรขึ้นที่นี่และกฎของการแยกเปลี่ยนไปอย่างไรใน Java 8
110 java  regex  split  java-8 

3
ส่วนต่อประสานการทำงานของ Java 8 ที่ไม่มีอาร์กิวเมนต์และไม่มีค่าส่งคืน
อะไรคืออินเทอร์เฟซการทำงานของ Java 8 สำหรับวิธีการที่ไม่ใช้อะไรเลยและไม่ส่งคืนอะไรเลย กล่าวคือเทียบเท่ากับ C # ที่ไม่มีพารามิเตอร์ที่Actionมีvoidชนิดส่งคืน?
110 java  java-8  java-stream 

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