2015-07-24 22 views
14

Tôi đã theo mã đơn giản mà tôi đang cố gắng để chuyển đổi sang phong cách chức năngThay if-else trong 'cho' vòng với Java-8 Streams

for(String str: list){ 
    if(someCondition(str)){ 
     list2.add(doSomeThing(str)); 
    } 
    else{ 
     list2.add(doSomethingElse(str)); 
    } 
} 

Có một cách dễ dàng có thể thay thế vòng tuần hoàn này với dòng? Chỉ có tùy chọn tôi thấy là lặp qua luồng hai lần với hai điều kiện bộ lọc khác nhau.

+3

Và tại sao bạn muốn làm điều đó nếu mã của bạn chỉ hoạt động? – fge

+4

Bạn có thể sử dụng bản đồ với câu lệnh có điều kiện 'List list2 = list.stream(). Map (str -> someCondition (str)? DoSomeThing (str): doSomethingElse (str)). Collect (toList()); ' . Cho dù đó là dễ đọc hơn hay không là tùy thuộc vào người đọc (tôi thấy nó rõ ràng cá nhân). Bạn luôn có thể trích xuất quy trình này thành một phương thức trợ giúp nếu bạn muốn. –

+1

@fge chỉ để hiểu lập trình chức năng tốt hơn trong Java :) – sidgate

Trả lời

23

Có vẻ như bạn chỉ có thể sử dụng map với một điều kiện:

List<String> list2 = list 
    .stream() 
    .map(str -> someCondition(str) ? doSomething(str) : doSomethingElse(str)) 
    .collect(Collectors.toList()); 

ngắn nhưng đầy đủ ví dụ lập bản đồ chuỗi ngắn để giảm trường hợp và những người lâu để chữ hoa:

import java.util.*; 
import java.util.stream.*; 

public class Test { 

    public static void main(String[] args) { 
     List<String> list = Arrays.asList("abC", "Long Mixed", "SHORT"); 
     List<String> list2 = list 
      .stream() 
      .map(str -> str.length() > 5 ? str.toUpperCase() : str.toLowerCase()) 
      .collect(Collectors.toList()); 
     for (String result : list2) { 
      System.out.println(result); // abc, LONG MIXED, short 
     } 
    } 
} 
+12

Vì chúng ta đang thực hiện Java 8, chúng ta cũng có thể ghi nhật ký như thế này: list2.forEach (System.out :: println); –

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