Làm thế nào để Lặp lại Luồng với Chỉ số

1. Khái quát chung

Java 8 Streams không phải là bộ sưu tập và các phần tử không thể được truy cập bằng cách sử dụng các chỉ mục của chúng, nhưng vẫn có một số thủ thuật để thực hiện điều này.

Trong bài viết ngắn này, chúng ta sẽ xem xét làm thế nào để lặp qua một suối sử dụng IntStream, StreamUtils, EntryStream,Vavr 's suối .

2. Sử dụng Plain Java

Chúng tôi có thể điều hướng qua Luồng bằng phạm vi Số nguyên và cũng được hưởng lợi từ thực tế là các phần tử gốc nằm trong một mảng hoặc một tập hợp có thể truy cập bằng chỉ số.

Hãy triển khai một phương thức lặp lại với các chỉ số và thể hiện cách tiếp cận này.

Nói một cách đơn giản, chúng ta muốn lấy một mảng Chuỗi và chỉ chọn các phần tử chẵn được lập chỉ mục:

public List getEvenIndexedStrings(String[] names) { List evenIndexedNames = IntStream .range(0, names.length) .filter(i -> i % 2 == 0) .mapToObj(i -> names[i]) .collect(Collectors.toList()); return evenIndexedNames; }

Bây giờ chúng ta hãy kiểm tra việc triển khai:

@Test public void whenCalled_thenReturnListOfEvenIndexedStrings() { String[] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; List expectedResult = Arrays.asList("Afrim", "Besim", "Durim"); List actualResult = StreamIndices.getEvenIndexedStrings(names); assertEquals(expectedResult, actualResult); }

3. Sử dụng StreamUtils

Một cách khác để lặp lại với các chỉ mục có thể được thực hiện bằng cách sử dụng phương thức zipWithIndex () của StreamUtils từ thư viện gói proton (bạn có thể tìm thấy phiên bản mới nhất tại đây).

Trước tiên, bạn cần thêm nó vào pom.xml của mình :

 com.codepoetics protonpack 1.13  

Bây giờ, hãy xem mã:

public List
    
      getEvenIndexedStrings(List names) { List
     
       list = StreamUtils .zipWithIndex(names.stream()) .filter(i -> i.getIndex() % 2 == 0) .collect(Collectors.toList()); return list; }
     
    

Các bước sau kiểm tra phương pháp này và vượt qua thành công:

@Test public void whenCalled_thenReturnListOfEvenIndexedStrings() { List names = Arrays.asList( "Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"); List
    
      expectedResult = Arrays.asList( Indexed.index(0, "Afrim"), Indexed.index(2, "Besim"), Indexed.index(4, "Durim")); List
     
       actualResult = StreamIndices.getEvenIndexedStrings(names); assertEquals(expectedResult, actualResult); }
     
    

4. Sử dụng StreamEx

Chúng tôi cũng có thể lặp lại với chỉ số sử dụng filterKeyValue () của EntryStream lớp từ StreamEx thư viện (phiên bản mới nhất có thể được tìm thấy ở đây). Đầu tiên, chúng ta cần thêm nó vào pom.xml:

 one.util streamex 0.6.5 

Hãy xem một ứng dụng đơn giản của phương pháp này bằng cách sử dụng ví dụ trước của chúng tôi:

public List getEvenIndexedStringsVersionTwo(List names) { return EntryStream.of(names) .filterKeyValue((index, name) -> index % 2 == 0) .values() .toList(); }

Chúng tôi sẽ sử dụng một bài kiểm tra tương tự để kiểm tra điều này:

@Test public void whenCalled_thenReturnListOfEvenIndexedStringsVersionTwo() { String[] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; List expectedResult = Arrays.asList("Afrim", "Besim", "Durim"); List actualResult = StreamIndices.getEvenIndexedStrings(names); assertEquals(expectedResult, actualResult); }

5. Sử dụng Iteration Vavre 's Suối

Một cách chính đáng của lặp được sử dụng zipWithIndex () phương pháp Vavr (trước đây được gọi là Javaslang ) 's Suối thực hiện:

public List getOddIndexedStringsVersionTwo(String[] names) { return Stream .of(names) .zipWithIndex() .filter(tuple -> tuple._2 % 2 == 1) .map(tuple -> tuple._1) .toJavaList(); }

Chúng ta có thể kiểm tra ví dụ này bằng phương pháp sau:

@Test public void whenCalled_thenReturnListOfOddStringsVersionTwo() { String[] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; List expectedResult = Arrays.asList("Bashkim", "Lulzim", "Shpetim"); List actualResult = StreamIndices.getOddIndexedStringsVersionTwo(names); assertEquals(expectedResult, actualResult); }

Nếu bạn muốn đọc thêm về Vavr, hãy xem bài viết này.

6. Kết luận

Trong hướng dẫn nhanh này, chúng tôi đã thấy bốn cách tiếp cận về cách lặp lại các luồng bằng cách sử dụng chỉ số. Các luồng đã nhận được rất nhiều sự chú ý và cũng có thể lặp lại chúng với các chỉ số có thể hữu ích.

Có rất nhiều tính năng được bao gồm trong Java 8 Streams, một số tính năng đã được đề cập trên Baeldung.

Mã cho tất cả các ví dụ được giải thích ở đây và nhiều hơn nữa có thể được tìm thấy trên GitHub.