75225


下記のような実装の場合、isAAAまたはisBBBのとき以外は実行文CCCを実行し、  
また実行文共通の箇所をまとめるような実装方法などありますでしょうか？

[code]

    for (line : List) {
        if (isAAA(line)) { 実行文AAA; 実行文共通; continue; } 
        if (isBBB(line)) { 実行文BBB; 実行文共通; continue; }
     
        実行文CCC;
    }
    
[/code]


CC BY-SA 4.0
2021-04-12T11:13:12.203
75224
2021-04-28T05:17:51.237
2021-04-12T12:27:39.130
3060
41188
question
java
Javaのfor文の中でcontinueが複数ある場合の実装を簡略化したい


if をネストするとか：

[code]

    for (line : List) {
        if (isAAA(line) || isBBB(line)) {
            if (isAAA(line)) { 実行文AAA; }
            if (isBBB(line)) { 実行文BBB; }
            実行文共通;
            continue;
        }
    
        実行文CCC;
    }
    
[/code]

フラグを使うとか：

[code]

    for (line : List) {
        boolean flag;
    
        if (isAAA(line)) { 実行文AAA; flag = true; }
        if (isBBB(line)) { 実行文BBB; flag = true; }
    
        if (flag) {    
            実行文共通;
            continue;
        }
    
        実行文CCC;
    }
    
[/code]

むしろ実行文共通を独立したメソッドにして別に定義してしまえば、同じものを繰り返し記述しても構わないとも思います：

[code]

    for (line : List) {
        boolean flag;
    
        if (isAAA(line)) { 実行文AAA; 共通メソッド; continue; }
        if (isBBB(line)) { 実行文BBB; 共通メソッド; continue; }
    
        実行文CCC;
    }
    
    void 共通メソッド() {}
    
[/code]


CC BY-SA 4.0
2021-04-12T11:55:54.590
75225
2021-04-12T12:02:50.350
2021-04-12T12:02:50.350
7290
7290
75224
answer


逆に、実行文CCC の時に `continue` をするという手が考えられます。

[code]

    for (line : List) {
        if (isAAA(line)) { 
            実行文AAA;
        } else if (isBBB(line)) {
            実行文BBB;
        } else {
            実行文CCC;
    
            // 共通処理を実行しないで次へ
            continue;
        }
    
        実行文共通;
    }
    
[/code]

もしくは、共通メソッドを用意するという手があります。

[code]

    for (line : List) {
        if (isAAA(line)) { 
            実行文AAA;
            共通メソッド();
        } else if (isBBB(line)) {
            実行文BBB;
            共通メソッド();
        } else {
            実行文CCC;
        }
    }
    
    void 共通メソッド() {}
    
[/code]


CC BY-SA 4.0
2021-04-15T02:43:35.593
75285
2021-04-15T07:09:02.107
2021-04-15T07:09:02.107
14334
14334
75224
answer


ちょっと無理やり感がありますがStreamを使う例です。  
こんな方法もある程度で…

[code]

    list.stream().filter(line -> {
        if (isAAA(line)) {
            実行文AAA;
            return true;
        }
        if (isBBB(line)) {
            実行文BBB;
            return true;
        }
    
        実行文CCC;
        return false;
    
    }).forEach(line -> {
        実行文共通;
    });
    
[/code]


CC BY-SA 4.0
2021-04-28T05:17:51.237
75550
2021-04-28T05:17:51.237
45020
75224
answer