Cách lấy phần tử tiếp theo từ Danh sách bằng cách sử dụng Java 8 Streams? Nếu tôi đang lặp qua Danh sách, tôi muốn so sánh hiện tại với phần tử tiếp theo của danh sách, có thể sử dụng Java 8 Stream không?Dòng Java 8, cách so sánh phần tử hiện tại với phần tử tiếp theo?
Trả lời
Một cách là tạo một số IntStream
của các chỉ mục và tìm nạp các phần tử List
theo chỉ mục của chúng. Điều này chỉ hiệu quả nếu số List
hỗ trợ truy cập ngẫu nhiên (ví dụ: nếu List
của bạn là LinkedList
, sẽ là một ý tưởng tồi, vì list.get(i)
không mất thời gian cố định).
Ví dụ:
IntStream.range(0,list.size()-1).forEach(i -> {
doSomething(list.get(i),list.get(i+1));
});
Một cách khác là để lưu trữ các yếu tố cuối cùng trong một mảng:
List<Element> list = ...
Element[] arr = new Element[1];
list.stream().forEach(e -> {
if (arr[0] != null)
doSomething(arr[0],e);
arr[0]=e;
});
này sẽ chỉ làm việc cho các dòng tuần tự.
Thư viện StreamEx miễn phí của tôi cho phép bạn xử lý các cặp phần tử luồng bằng cách sử dụng hoạt động trung gian pairMap
bổ sung. Như thế này:
StreamEx.of(input).pairMap((current, next) -> doSomethingWith(current, next));
đâu input
là một mảng Collection
hoặc Stream
. Ví dụ, bằng cách này bạn có thể dễ dàng kiểm tra xem đầu vào được sắp xếp:
boolean isSorted = StreamEx.of(input)
.pairMap((current, next) -> next.compareTo(current))
.allMatch(cmp -> cmp >= 0);
Ngoài ra còn có forPairs
thiết bị đầu cuối hoạt động mà là một analog forEach
cho tất cả các cặp của các yếu tố đầu vào:
StreamEx.of(input).forPairs((current, next) -> doSomethingWith(current, next));
Những tính năng làm việc độc đáo với bất kỳ nguồn luồng nào (truy cập ngẫu nhiên hay không) và hỗ trợ đầy đủ các luồng song song.
tuyệt vời. Cảm ơn vì đã giải thích. – bhupen
Bạn luôn làm một trong sau:
- Chuyển đổi luồng của mình để một dòng của các yếu tố có chứa "lịch sử" của vài yếu tố cuối cùng của dòng
- Process luồng của mình theo cách như vậy mà hiện xử lý yếu tố được coi là phần tử "tiếp theo" và phần tử được xử lý trước đó được coi là phần tử "hiện tại".
Triển khai của cả hai giải pháp có thể được nhìn thấy trong luồng này: Is it possible to get next element in the Stream?
tôi phải làm như vậy và so sánh sự khác nhau của các yếu tố của một dòng (ban đầu là một mảng). Vì vậy, tôi đã sử dụng một phương pháp như một tham số để các UniaryOperator rằng .map() dự kiến như sau ... và nó làm việc cho tôi mà không cần bất kỳ Gizmo đặc biệt của:
import java.util.Arrays;
class streamDiffUtil {
public static void main(String[] args) {
int[] elements = {1,2,5};
int result = Arrays.stream(elements)
.map(value -> calcMaxDiff(value, elements))
.max()
.getAsInt();
System.out.println(result);
}
private static int calcMaxDiff(int j, int[] elements) {
return Arrays.stream(elements)
.map(value -> Math.abs(j-value))
.max().getAsInt();
}
}
Điều gì sẽ là tốt đẹp là để biết làm thế nào phương pháp calcMaxDiff tương đương với một UnaryIntOperator trong chữ ký .map. Đó là một chút ngoài tôi. Hy vọng điều này sẽ giúp bạn.
Stream.reduce có thể được sử dụng, tùy thuộc vào mục tiêu.
- 1. Java 8: Cách so sánh tất cả các phần tử của Bộ
- 2. Peek phần tử tiếp theo trong luồng
- 3. CSS phần tử tiếp theo
- 4. Làm cách nào để chọn các phần tử "n" tiếp theo bắt đầu từ phần tử hiện tại trong jQuery?
- 5. jQuery - Tìm phần tử chọn tiếp theo
- 6. Mongoose - Chuyển đến phần tử tiếp theo
- 7. Mảng chuyển sang phần tử tiếp theo
- 8. Jquery chọn phần tử tiếp theo
- 9. Dòng Java 8 - phần tử bản đồ để ghép các thành phần
- 10. Tại sao tôi không thể gán phần tử enum sai, nhưng có thể so sánh với phần tử enum sai?
- 11. cách so sánh hai phần tử trong jquery
- 12. So sánh XML bỏ qua thứ tự phần tử
- 13. Cách ẩn phần tử nếu phần tử khác tồn tại
- 14. Thêm các phần tử vào Java 8 Dòng song song một cách nhanh chóng
- 15. Không thể so sánh hai phần tử trong mảng
- 16. "phần tử tiếp theo đã được chiếm đóng" lỗi
- 17. Làm cách nào để chèn phần tử trực tiếp sau phần tử khác với XMLStarlet?
- 18. So sánh các phần tử HTML theo z-index thực tế
- 19. Java 8 suối để tìm phần tử trong danh sách
- 20. So sánh hai phần tử liên tiếp trong tiêu chuẩn: danh sách
- 21. Lấy phần tử hiện tại trong scipy.ndimage.filters.generic_filter
- 22. Tổng hợp hai phần tử theo từng phần tử trong Java
- 23. Lặp lại trên một mảng và trả về phần tử tiếp theo và trước phần hiện tại
- 24. So sánh các mảng có cùng các phần tử theo thứ tự khác nhau
- 25. Peek phần tử tiếp theo trong hộp chứa STL
- 26. Cách lấy phần tử theo tên lớp
- 27. Có thể nhận phần tử tiếp theo trong Luồng không?
- 28. Xóa hai phần tử trong một dòng
- 29. so sánh nếu một phần tử tồn tại trong hai danh sách
- 30. Nhận id của phần tử gốc của phần tử được nhấp hiện tại trong AngularJS
Lặp lại cách thực hiện?Làm thế nào để bạn xác định các yếu tố hiện tại và tiếp theo? Tại sao bạn cảm thấy cần phải làm điều này với các luồng? –
Mục tiêu của bạn là gì? – zeroflagL
Mục tiêu của tôi là so sánh hai phần tử liên tiếp trong danh sách hoặc có thể tôi muốn kiểm tra xem chúng có bằng nhau hay không. – bhupen