web-dev-qa-db-ja.com

「for」ループ内のif-elseをJava-8ストリームで置き換える

私は機能的なスタイルに変換しようとしている簡単なコードを持っています

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

このループをストリームに置き換えるのは簡単ですか?私が見る唯一のオプションは、2つの異なるフィルター条件でストリームを2回繰り返すことです。

14
sidgate

mapを条件付きで使用できるようです:

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

短い文字列を小文字に、長い文字列を大文字にマッピングする完全な例:

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
        }
    }
}
23
Jon Skeet