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

ใช้แท็กนี้สำหรับคำถามที่เกี่ยวข้องกับการใช้ Stream API มันถูกนำมาใช้ใน Java 8 และสนับสนุนการดำเนินงานสไตล์การทำงานกับกระแสของค่าเช่นท่อกรองลดแผนที่ในคอลเลกชัน

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

3
การดำเนินการสตรีมระดับกลางไม่ได้รับการประเมินตามจำนวน
ดูเหมือนว่าฉันมีปัญหาในการเข้าใจวิธีที่ Java รวบรวมการดำเนินการในการสตรีมไปป์ไลน์ เมื่อรันโค้ดต่อไปนี้ public static void main(String[] args) { StringBuilder sb = new StringBuilder(); var count = Stream.of(new String[]{"1", "2", "3", "4"}) .map(sb::append) .count(); System.out.println(count); System.out.println(sb.toString()); } 4คอนโซลเพียงพิมพ์ StringBuilderวัตถุยังคงมีค่า""วัตถุยังคงมีค่า เมื่อฉันเพิ่มการดำเนินการตัวกรอง: filter(s -> true) public static void main(String[] args) { StringBuilder sb = new StringBuilder(); var count = Stream.of(new String[]{"1", …
33 java  java-stream 

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()); } แต่บางทีอาจจะมีวิธีที่ดีกว่าไม่มีอะไรในใจของคุณ?


3
Parallel Infinite Java Streams หน่วยความจำไม่เพียงพอ
ฉันพยายามที่จะเข้าใจว่าทำไมโปรแกรม Java ต่อไปนี้ถึงให้OutOfMemoryErrorในขณะที่โปรแกรมที่สอดคล้องกันโดย.parallel()ไม่ได้ System.out.println(Stream .iterate(1, i -> i+1) .parallel() .flatMap(n -> Stream.iterate(n, i -> i+n)) .mapToInt(Integer::intValue) .limit(100_000_000) .sum() ); ฉันมีสองคำถาม: ผลลัพธ์ที่ต้องการของโปรแกรมนี้คืออะไร? หากปราศจาก.parallel()ดูเหมือนว่านี่เป็นเพียงการแสดงผลsum(1+2+3+...)ซึ่งหมายความว่าเพียง "ติด" ที่กระแสแรกใน flatMap ซึ่งทำให้รู้สึก เมื่อใช้คู่ขนานฉันไม่รู้ว่ามีพฤติกรรมที่คาดหวังหรือไม่ แต่ฉันเดาว่าจะเป็นอย่างใดอย่างหนึ่งที่มันแทรกซึมnลำธารสายแรกหรือสายอื่นnๆ มันอาจแตกต่างกันเล็กน้อยขึ้นอยู่กับพฤติกรรมการ chunking / buffering ทำให้หน่วยความจำไม่เพียงพอคืออะไร ฉันพยายามทำความเข้าใจว่ากระแสเหล่านี้ถูกนำไปใช้อย่างไรภายใต้ประทุน ฉันคาดเดาสิ่งที่บล็อกกระแสดังนั้นมันไม่เคยเสร็จสิ้นและสามารถกำจัดค่าที่สร้างขึ้นได้ แต่ฉันไม่ค่อยรู้ว่าสิ่งใดที่เรียงลำดับตามการประเมินและที่การบัฟเฟอร์เกิดขึ้น แก้ไข:ในกรณีที่มีความเกี่ยวข้องฉันใช้ Java 11 Editt 2:เห็นได้ชัดว่าสิ่งเดียวกันที่เกิดขึ้นแม้สำหรับโปรแกรมที่ง่ายIntStream.iterate(1,i->i+1).limit(1000_000_000).parallel().sum()ดังนั้นจึงอาจจะต้องทำอย่างไรกับ lazyness ของมากกว่าlimitflatMap

5
วิธีสร้างแผนที่ด้วยค่าที่แตกต่างจากแผนที่ (และใช้ปุ่มขวาโดยใช้ BinaryOperator)
ฉันมีแผนที่Map<K, V>และเป้าหมายของฉันคือการลบค่าที่ซ้ำกันและเอาท์พุทโครงสร้างเดียวกันMap<K, V>อีกครั้ง ในกรณีที่พบค่าที่ซ้ำกันจะต้องมีการเลือกหนึ่งคีย์ ( k) จากสองคีย์ ( k1และk1) ที่เก็บค่าเหล่านี้ด้วยเหตุผลนี้ให้ถือว่ามีการBinaryOperator<K>ให้kจากk1และk2พร้อมใช้งาน ตัวอย่างอินพุตและเอาต์พุต: // Input Map<Integer, String> map = new HashMap<>(); map.put(1, "apple"); map.put(5, "apple"); map.put(4, "orange"); map.put(3, "apple"); map.put(2, "orange"); // Output: {5=apple, 4=orange} // the key is the largest possible ความพยายามของฉันใช้Stream::collect(Supplier, BiConsumer, BiConsumer)เป็นบิตเงอะงะมากและมีการดำเนินงานที่ไม่แน่นอนเช่นMap::putและMap::removeที่ฉันต้องการจะหลีกเลี่ยง: // // the key is the largest …

2
จะเข้าใจวิธีการรวบรวม Java 8 Stream นี้ได้อย่างไร?
ฉันพยายามแปลง int เป็น List และใช้เส้นทางที่ไม่คุ้นเคยในการใช้ Java 8 Stream และคิดสิ่งนี้ขึ้นมา Arrays.stream(arr).boxed().collect(Collectors.toList()); ฉันยังคงมีปัญหาในการเข้าใจบรรทัดนี้ส่วนใหญ่ เหตุใดCollectors.toList()ในกรณีนี้จึงส่งคืนอินเตอร์เฟสที่ArrayList<Integer>ใช้งาน Listทำไมไม่LinkedList<Integer>หรือคลาสทั่วไปอื่น ๆ ที่สอดคล้องกับListอินเตอร์เฟส? ฉันไม่พบสิ่งใดเกี่ยวกับเรื่องนี้ยกเว้นการกล่าวถึง ArrayList สั้น ๆที่นี่ในส่วน API Notes แผงด้านซ้าย หมายถึงอะไร เห็นได้ชัดว่าเป็นประเภทผลตอบแทนทั่วไป ( ในรหัสของฉันที่นี่) และฉันคิดว่าเป็นอาร์กิวเมนต์ประเภททั่วไปของวิธีการ แต่พวกเขาจะระบุได้อย่างไร ผมมองเข้าไปสะสมอินเตอร์เฟซ doc และไม่สามารถที่จะดูดซึมได้ Stream.collect()RArrayList<Integer><R, A>

2
คุณสามารถปรับสมดุล Spliterator ที่ไม่ทราบขนาดได้หรือไม่?
ฉันต้องการใช้การStreamประมวลผลแบบขนานของชุดไฟล์ JSON ที่จัดเก็บจากระยะไกลซึ่งเป็นหมายเลขที่ไม่รู้จัก (จำนวนไฟล์ไม่ทราบล่วงหน้า) ไฟล์สามารถมีขนาดแตกต่างกันอย่างมากตั้งแต่ 1 ระเบียน JSON ต่อไฟล์สูงสุด 100,000 ระเบียนในไฟล์อื่น ๆ บันทึก JSONในกรณีนี้หมายถึงการที่ตนเองมีวัตถุ JSON แสดงเป็นหนึ่งบรรทัดในไฟล์ ฉันต้องการใช้ Streams สำหรับสิ่งนี้และดังนั้นฉันจึงใช้สิ่งนี้Spliterator: public abstract class JsonStreamSpliterator<METADATA, RECORD> extends AbstractSpliterator<RECORD> { abstract protected JsonStreamSupport<METADATA> openInputStream(String path); abstract protected RECORD parse(METADATA metadata, Map<String, Object> json); private static final int ADDITIONAL_CHARACTERISTICS = Spliterator.IMMUTABLE | Spliterator.DISTINCT | …

3
กระแสข้อมูล Java แบบขนาน - ลำดับของการเรียกใช้เมธอด parallel () [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิด4 วันที่ผ่านมา AtomicInteger recordNumber = new AtomicInteger(); Files.lines(inputFile.toPath(), StandardCharsets.UTF_8) .map(record -> new Record(recordNumber.incrementAndGet(), record)) .parallel() .filter(record -> doSomeOperation()) .findFirst() เมื่อฉันเขียนสิ่งนี้ฉันสันนิษฐานว่าเธรดจะวางไข่เฉพาะการเรียกแผนที่เนื่องจากวางขนานหลังจากแผนที่ แต่บางบรรทัดในไฟล์ได้รับหมายเลขบันทึกที่แตกต่างกันสำหรับการดำเนินการทุกครั้ง ฉันอ่านเอกสาร Java streamอย่างเป็นทางการและเว็บไซต์บางแห่งเพื่อทำความเข้าใจวิธีการทำงานของสตรีมภายใต้ฮูด คำถามเล็กน้อย: Java กระแสขนานทำงานบนพื้นฐานของSplitIteratorซึ่งดำเนินการโดยคอลเลกชันทุกอย่างเช่น ArrayList, LinkedList เป็นต้นเมื่อเราสร้างสตรีมขนานจากคอลเลกชันเหล่านั้นตัววนซ้ำที่สอดคล้องกันนั้นจะถูกใช้เพื่อแยกและย้ำคอลเลกชัน สิ่งนี้อธิบายว่าเหตุใดจึงเกิดความขนานที่แหล่งอินพุตดั้งเดิม (เส้นไฟล์) แทนที่จะเป็นผลลัพธ์ของแผนที่ (เช่นเร็กคอร์ด pojo) ความเข้าใจของฉันถูกต้องหรือไม่ ในกรณีของฉันอินพุตเป็นไฟล์สตรีม IO จะใช้ตัววนซ้ำแบบแยกใด ไม่สำคัญว่าเราจะวางไว้ที่ไหนparallel()ในท่อส่ง แหล่งอินพุตดั้งเดิมจะถูกแยกเสมอและจะใช้การดำเนินการระดับกลางที่เหลืออยู่ ในกรณีนี้ Java ไม่ควรอนุญาตให้ผู้ใช้ทำการดำเนินการแบบขนานที่ใดก็ได้ในไปป์ไลน์ยกเว้นที่แหล่งต้นฉบับ เนื่องจากเป็นการให้ความเข้าใจที่ผิดสำหรับผู้ที่ไม่ทราบว่า …
11 java  java-stream 

3
Custom Sorting ในแบบที่ A มาก่อน a และ B มาก่อน b
ฉันมีรายการสีดังนี้: ชมพู, ฟ้า, แดง, น้ำเงิน, เทา, เขียว, ม่วง, ดำ ... ฯลฯ List<String> listOfColors = Arrays.asList("Pink", "Blue", "Red", "blue", "Grey", "green", "purple", "black"); มีการดำเนินการระดับกลางบางอย่างเช่นการกรองสีผลไม้ตอนนี้ฉันเหลือผลลัพธ์การกรองที่ฉันต้องการเรียงลำดับ: สีน้ำเงิน, ดำ, น้ำเงิน, เทา, เขียว, ชมพู, ม่วง, แดง ฉันเหนื่อย : List<String> collect = listOfColors.stream().sorted(String::compareToIgnoreCase) .collect(Collectors.toList()); มันไม่ทำงานตามที่คาดไว้ ผลลัพธ์มีดังต่อไปนี้: ดำ, น้ำเงิน, น้ำเงิน, เขียว, เทา, ชมพู, ม่วง, แดง ฉันต้องการสิ่งต่อไปนี้: สีน้ำเงิน, …

2
การล้างรายการข้อมูลใน Java8
สำหรับการล้างรายการข้อมูลฉันได้สร้างวิธีการที่ยอมรับรายการข้อมูลและรายการการดำเนินการล้างที่จะดำเนินการ public <T> List<T> cleanData(List<T> data, List<Function<T, T>> cleanOps) { List<T>dataNew=data.stream().map((str) -> { T cleanData = str; for(Function<T,T> function:cleanOps) { cleanData=function.apply(cleanData); } return cleanData; }).collect(Collectors.toList()); return dataNew; } ปัญหาที่นี่คือเรากำลังสร้างรายการทั้งหมดอีกครั้งเมื่อCollectors.toList()ส่งคืนรายการใหม่ เราสามารถบรรลุผลลัพธ์เดียวกันโดยไม่ต้องใช้พื้นที่เพิ่มเติมหรือไม่ ด้านล่างนี้เป็นรหัสสำหรับการร้องขอ: public void processData() { List<Function<String, String>> cleanOps = new ArrayList<>(); cleanOps.add(String::toLowerCase); cleanOps.add(str -> str.replaceAll(" ", "")); List<String> data = …

4
peek () และ allMatch () ทำงานร่วมกันอย่างไรใน Java 8 Stream API
ฉันพบคำถามเกี่ยวกับ Java 8 Stream API ของวิธีการแอบดูด้านล่าง Arrays.asList("Fred", "Jim", "Sheila") .stream() .peek(System.out::println) .allMatch(s -> s.startsWith("F")); ผลลัพธ์คือ Fred Jim ฉันสับสนว่าสตรีมนี้ทำงานอย่างไร ผลลัพธ์ที่คาดหวังของฉันควรจะเป็น Fred Jim Sheila peek () วิธีการคือการดำเนินการระดับกลางและจะประมวลผลแต่ละองค์ประกอบในสตรีม ใครสามารถอธิบายฉันนี้

8
ลบองค์ประกอบแรก (ที่มีดัชนีศูนย์) จากกระแสตามเงื่อนไข
ฉันมีรหัสต่อไปนี้: Stream<String> lines = reader.lines(); หากสตริงกำปั้นเท่ากับ"email"ฉันต้องการลบสตริงแรกจากกระแส สำหรับสตริงอื่น ๆ จากสตรีมฉันไม่ต้องการการตรวจสอบนี้ ฉันจะปวดร้าวได้อย่างไร PS แน่ใจว่าฉันสามารถแปลงเป็นรายการจากนั้นใช้โรงเรียนเก่าสำหรับวง แต่ต่อไปฉันต้องสตรีมอีกครั้ง

6
วิธีค้นหาวันที่ล่าสุดจากค่าแม็พที่กำหนดใน java
ฉันกำลังแฮชแผนที่ที่มีค่าด้านล่างในค่าที่ฉันเคยเป็นชนิดข้อมูลสตริง ฉันต้องการเปรียบเทียบวันที่ทั้งหมดที่มีอยู่ในแผนที่และดึงคีย์ - ค่าเดียวเท่านั้นที่มีวันที่ล่าสุด ฉันอยากจะเปรียบเทียบกับค่าที่ไม่ใช่กุญแจ ฉันได้รวมรหัสด้านล่าง import java.util.HashMap; import java.util.Map; public class Test { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); map.put("1", "1999-01-01"); map.put("2", "2013-10-11"); map.put("3", "2011-02-20"); map.put("4", "2014-09-09"); map.forEach((k, v) -> System.out.println("Key : " + k + " Value : " + v)); } …

4
การจัดการข้อยกเว้นด้วยสตรีม
ฉันมีMap<String,List<String>>และต้องการที่จะกลายเป็นMap<String,List<Long>>เพราะแต่ละคนStringในรายการแสดงถึงLong: Map<String,List<String>> input = ...; Map<String,List<Long>> output= input.entrySet() .stream() .collect(toMap(Entry::getKey, e -> e.getValue().stream() .map(Long::valueOf) .collect(toList())) ); ปัญหาหลักของฉันคือแต่ละคนStringอาจไม่ได้แสดงอย่างถูกต้อง a Long; อาจมีปัญหาบางอย่าง Long::valueOfอาจเพิ่มข้อยกเว้น หากเป็นกรณีนี้ฉันต้องการคืนค่าว่างหรือไม่Map<String,List<Long>> เพราะฉันต้องการทำซ้ำหลังจากผ่านoutputแผนที่นี้ แต่ฉันไม่สามารถยอมรับการแปลงผิดพลาดได้ ไม่แม้แต่คนเดียว มีความคิดเกี่ยวกับวิธีที่ฉันสามารถคืนเอาต์พุตว่างในกรณีที่ String ไม่ถูกต้อง -> การแปลงยาว?

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