2016-08-17 2 views
-1

私は自分自身がよりエレガントなラムダ式にいたるところで使用していることがわかった単純なif-elseステートメントを変換しようとしています。しかし、私が読んできたことから解決策が出てくるのは難しいことです。if-elseをλ式に変換する

簡単な声明は次のようになります:

if (status.getStatus() == 'A') then 
    handleA(); 
else if (status.getStatus() == 'B') then 
    handleB(); 
else 
    handleEverythingElse(); 

私はマップとCommandパターンを使用することができます知っているが、私は私が欠けているいくつかのJava 8の優雅さがあります確信しています。誰かが私にインターフェイス& implを教えてもらえますか?それはコード本体での使用です(私は例として学びます)?

任意の助けもいただければ幸いです!

+7

初心者の方は 'switch'ステートメントを使うことができます...しかし、どうしてラムダが必要なのですか?それがうまくいったら、修正しないでください。 – fge

+0

あなたは何を正確に期待していますか? 'Function'の使い方? –

+2

'() - > {/ *あなたのコード* /}' –

答えて

0

多分、私は自分の問題について完全に説明していないかもしれませんが、私の同僚は私が本当に好きな別の解決策を提案しました。彼は、if-elseブロックをjava.util.Supplierにして、それが必要なところのEntityクラスで呼び出すように提案しました。

だから私のコードはどこにでも振りかけロジックのこのブロックから行ってきました:この素敵な固めのフォームに

public class ServiceImpl { 
    ... 
    if (entity.getStatus) == 'A' then 
    finalStatus = handleA(); 
    else if (entity.getStatus() == 'B') then 
    finalStatus = handleB(); 
    else 
    finalStatus = handleEverythingElse(); 
    ... 
} 

public class ServiceImpl { 
    finalStatus = entity.getFinalStatus(this::handleStatus); 

    public int handleStatus() { 
    return dao.getStatus(); 
    } 
} 

私のエンティティクラスの実装では:

public class Entity { 
    public int handleStatus(Supplier<Integer> s) { 
    int finalStatus; 
    if (status) == 'A' then 
     finalStatus = handleA(); 
    else if (status() == 'B') then 
     finalStatus = handleB(); 
    else 
     finalStatus = supplier.get(); 
    return status; 
    } 
} 

私はこれが意味をなさないことを願っています...

2

もし/ elseまたはスイッチが "良いOOデザイン"の答えでないならば。ラムダもそうではありません。どこかからステータスを取得し、それに基づいて決定する - それは手続き型プログラミングです。 OOではない。

実際にあなたの目の前にあるものは、状態マシンです。あなたは異なる州を持っています;ポイントは:あなたの「もの」が状態Aにある場合。次に何かをしたい(handleA()を呼び出す)。あなたの状態がBの場合、あなたも(handleB()の呼び出しのような)何かをしたい。

だから、あなたが実際に持っているものです。

abstract class State { 
    abstract void doIt(); 
... 

StateA extends State { 
    @Override 
    void doIt() { handleA(); } 

ので、クライアント側から、あなただけのクラスの状態の同じオブジェクト上のdoIt()を呼び出します。

したがって、コードベースの改善に本当に関心がある場合は、if/else/switch文を削除するために多態性を使用する方法を学んでください。

このvideoを見ると、私が何を言っているのかを知ることができます。

+1

[XY問題](http://mywiki.wooledge.org/XyProblem)に見えるものにうまく答えます。 –

+0

@HovercraftFullOfEelsありがとうございます。自分のコードで最初にそのようなことについて話したとき、私は自分の顔を覚えています。それでは、この種の問題の周りの良いOOデザインを作成することは、とても有益なことです...私はできるだけ頻繁にそのようなアイデアを共有することに抵抗することはできません。 – GhostCat