用Java-8 Streams替换'for'循环中的if-else

sid*_*ate 14 java functional-programming java-8

我有以下简单的代码,我试图转换为功能样式

for(String str: list){
    if(someCondition(str)){
       list2.add(doSomeThing(str));
    }
    else{
        list2.add(doSomethingElse(str));
    }
}
Run Code Online (Sandbox Code Playgroud)

是否可以用流替换这个循环?我看到的唯一选择是使用两个不同的过滤条件迭代流两次.

Jon*_*eet 23

听起来你可以使用map条件:

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

简短而完整的示例将短字符串映射为小写字母,将长字符串映射为大写字母:

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 由于我们正在使用Java 8,我们也可以像这样编写日志:list2.forEach(System.out :: println); (12认同)