ฉันเพิ่งค้นพบความสามารถของสตรีม Java 8 ใหม่ มาจาก Python ฉันสงสัยว่าตอนนี้มีวิธีที่ประณีตในการดำเนินการกับอาเรย์เช่นการหาผลรวมการคูณสองอาร์เรย์ในรูปแบบ "one pythonic" หรือไม่?
ขอบคุณ
ฉันเพิ่งค้นพบความสามารถของสตรีม Java 8 ใหม่ มาจาก Python ฉันสงสัยว่าตอนนี้มีวิธีที่ประณีตในการดำเนินการกับอาเรย์เช่นการหาผลรวมการคูณสองอาร์เรย์ในรูปแบบ "one pythonic" หรือไม่?
ขอบคุณ
คำตอบ:
มีวิธีการใหม่ที่เพิ่มเข้าไปในjava.util.Arrays
การแปลงอาร์เรย์เป็นสตรีม Java 8 ซึ่งสามารถใช้สำหรับการสรุป ฯลฯ
int sum = Arrays.stream(myIntArray)
.sum();
การคูณสองอาร์เรย์นั้นทำได้ยากขึ้นเล็กน้อยเพราะฉันไม่สามารถคิดหาวิธีรับค่าและดัชนีในเวลาเดียวกันกับการดำเนินการสตรีมได้ ซึ่งหมายความว่าคุณอาจต้องสตรีมไปยังดัชนีของอาร์เรย์
//in this example a[] and b[] are same length
int[] a = ...
int[] b = ...
int[] result = new int[a.length];
IntStream.range(0, a.length)
.forEach(i -> result[i] = a[i] * b[i]);
แก้ไข
Commenter @Holgerชี้ให้เห็นว่าคุณสามารถใช้map
วิธีการแทนวิธีforEach
นี้:
int[] result = IntStream.range(0, a.length).map(i -> a[i] * b[i]).toArray();
mapToInt
เพื่อหลีกเลี่ยงการชกมวย
คุณสามารถเปลี่ยนอาร์เรย์เป็นสตรีมได้โดยใช้Arrays.stream()
:
int[] ns = new int[] {1,2,3,4,5};
Arrays.stream(ns);
เมื่อคุณได้รับกระแสข้อมูลคุณสามารถใช้วิธีการใด ๆ ที่อธิบายไว้ในเอกสารประกอบเช่นsum()
หรืออะไรก็ตาม คุณสามารถmap
หรือfilter
ชอบใน Python โดยเรียกวิธีการสตรีมที่เกี่ยวข้องด้วยฟังก์ชั่น Lambda:
Arrays.stream(ns).map(n -> n * 2);
Arrays.stream(ns).filter(n -> n % 4 == 0);
เมื่อคุณปรับเปลี่ยนสตรีมของคุณเสร็จแล้วคุณสามารถโทรtoArray()
เพื่อแปลงกลับเป็นอาร์เรย์เพื่อใช้ที่อื่น:
int[] ns = new int[] {1,2,3,4,5};
int[] ms = Arrays.stream(ns).map(n -> n * 2).filter(n -> n % 4 == 0).toArray();
ระวังถ้าคุณต้องรับมือกับจำนวนมาก
int[] arr = new int[]{Integer.MIN_VALUE, Integer.MIN_VALUE};
long sum = Arrays.stream(arr).sum(); // Wrong: sum == 0
2 * Integer.MIN_VALUE
ผลรวมข้างต้นไม่ คุณต้องทำในกรณีนี้
long sum = Arrays.stream(arr).mapToLong(Long::valueOf).sum(); // Correct
โปรดทราบว่า Arrays.stream (arr) สร้าง LongStream (หรือ IntStream, ... ) แทน Stream เพื่อไม่ให้ฟังก์ชั่นแผนที่ใช้ในการปรับเปลี่ยนประเภท นี่คือเหตุผลที่ฟังก์ชัน. mapToLong, mapToObject, ...
ลองดูเหตุผลว่าทำไมถึงไม่ -i-map-integers-to-strings-when-streaming-from-an-array
int[] result=IntStream.range(0, a.length).map( i->a[i]* b[i]).toArray();