2016-02-12 20 views
5

Đôi khi sẽ thuận tiện khi thực hiện "một cái gì đó" (ví dụ: in) với mọi phần tử trong luồng ở giữa các bước xử lý luồng, ví dụ: để gỡ lỗi.Luồng Java "forEach" nhưng không tiêu thụ luồng

Một ví dụ đơn giản có thể trông như thế này, thật không may điều này không làm việc như forEach tiêu thụ dòng:

List<String> list = new ArrayList<>(); 
list.add("one"); 
list.add("two"); 
list.add("three"); 
list.add("four"); 

List<String> filteredList = 
     list.stream() 
     .filter(s -> s.startsWith("t")) 
     .forEach(System.out::println) 
     .collect(Collectors.toList()); 

Làm thế nào điều này có thể đạt được?

+0

có thể trùng lặp của [Java 8 Lambda Suối foreach với nhiều câu] (http://stackoverflow.com/questions/31130457/java-8-lambda-stream-foreach-with-multiple-statements) –

+1

@ DidierL Đó là bản sao không thực sự là một ví dụ tốt vì nó _mutates_ phần tử Stream bên trong hoạt động 'peek'. – Tunaki

+0

@Tunaki Tôi đoán một trong những đột biến đó cũng sẽ phù hợp khi người ta không thực sự cần phải đột biến. Câu trả lời thực sự giống nhau. Tôi cảm thấy như tất cả những câu hỏi liên quan đến 'peek' này hầu như luôn giống nhau. –

Trả lời

11

Bạn đang tìm kiếm các hoạt động peek:

Phương pháp này tồn tại chủ yếu để hỗ trợ gỡ lỗi, nơi bạn muốn để xem các yếu tố khi chảy qua một điểm nhất định trong một đường ống

này phương thức sẽ thực hiện hành động đã cho trên tất cả các phần tử của đường ống Luồng khi chúng được tiêu thụ. Như vậy, nó cho phép chụp peek của các phần tử.

List<String> filteredList = 
    list.stream() 
     .filter(s -> s.startsWith("t")) 
     .peek(System.out::println) 
     .collect(Collectors.toList()); 
Các vấn đề liên quan