2015-11-14 25 views
9

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?

+2

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? –

+0

Mục tiêu của bạn là gì? – zeroflagL

+0

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

Trả lời

7

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ự.

11

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.

+0

tuyệt vời. Cảm ơn vì đã giải thích. – bhupen

0

Bạn luôn làm một trong sau:

  1. 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
  2. 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?

0

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.

0

Stream.reduce có thể được sử dụng, tùy thuộc vào mục tiêu.

Các vấn đề liên quan