Tôi vừa phát hiện ra các khả năng luồng Java 8 mới. Đến từ Python, tôi đã tự hỏi liệu bây giờ có một cách gọn gàng để thực hiện các thao tác trên các mảng như tính tổng, nhân hai mảng theo cách "một dòng pythonic" không?
Cảm ơn
Tôi vừa phát hiện ra các khả năng luồng Java 8 mới. Đến từ Python, tôi đã tự hỏi liệu bây giờ có một cách gọn gàng để thực hiện các thao tác trên các mảng như tính tổng, nhân hai mảng theo cách "một dòng pythonic" không?
Cảm ơn
Câu trả lời:
Có các phương thức mới được thêm vào java.util.Arrays
để chuyển đổi một mảng thành luồng Java 8 mà sau đó có thể được sử dụng để tính tổng, v.v.
int sum = Arrays.stream(myIntArray)
.sum();
Nhân hai mảng khó hơn một chút vì tôi không thể nghĩ ra cách lấy giá trị VÀ chỉ mục cùng lúc với thao tác Luồng. Điều này có nghĩa là bạn có thể phải truyền phát qua các chỉ mục của mảng.
//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]);
BIÊN TẬP
Bình luận viên @Holger chỉ ra rằng bạn có thể sử dụng map
phương pháp thay vì forEach
như thế này:
int[] result = IntStream.range(0, a.length).map(i -> a[i] * b[i]).toArray();
mapToInt
để tránh đấm bốc.
Bạn có thể biến một mảng thành một luồng bằng cách sử dụng Arrays.stream()
:
int[] ns = new int[] {1,2,3,4,5};
Arrays.stream(ns);
Khi bạn đã có luồng của mình, bạn có thể sử dụng bất kỳ phương pháp nào được mô tả trong tài liệu , như sum()
hoặc bất cứ điều gì. Bạn có thể map
hoặc filter
thích trong Python bằng cách gọi các phương thức luồng có liên quan bằng hàm Lambda:
Arrays.stream(ns).map(n -> n * 2);
Arrays.stream(ns).filter(n -> n % 4 == 0);
Khi bạn hoàn tất sửa đổi luồng của mình, sau đó bạn gọi toArray()
để chuyển đổi lại thành một mảng để sử dụng ở nơi khác:
int[] ns = new int[] {1,2,3,4,5};
int[] ms = Arrays.stream(ns).map(n -> n * 2).filter(n -> n % 4 == 0).toArray();
Hãy cẩn thận nếu bạn phải đối phó với số lượng lớn.
int[] arr = new int[]{Integer.MIN_VALUE, Integer.MIN_VALUE};
long sum = Arrays.stream(arr).sum(); // Wrong: sum == 0
Số tiền trên không phải là 2 * Integer.MIN_VALUE
. Bạn cần phải làm điều này trong trường hợp này.
long sum = Arrays.stream(arr).mapToLong(Long::valueOf).sum(); // Correct
Xin lưu ý rằng Arrays.stream (mảng) tạo LongStream (hoặc IntStream, ...) thay vì Stream để chức năng bản đồ không thể được sử dụng để sửa đổi loại. Đây là lý do tại sao các hàm .mapToLong, mapToObject, ... được cung cấp.
Hãy xem tại sao-cant-i-map-integers-to-String-when-streaming-from-a-Array
int[] result=IntStream.range(0, a.length).map( i->a[i]* b[i]).toArray();