2016-09-20 7 views
1

ラムダ関数変数を使用する場合は、applyで関数を呼び出す代わりに使用します。Java8 Lambda関数は代替構文を適用します

Function<String, String> mesgFunction = (name) -> "Property "+ name +" is not set in the environment"; 
Optional.ofNullable(System.getProperty("A")).orElseThrow(() -> new IllegalArgumentException(mesgFunction.apply("A"))); 
Optional.ofNullable(System.getProperty("B")).orElseThrow(() -> new IllegalArgumentException(mesgFunction.apply("B"))); 

mesgFunction.apply("A")には短い構文がありますか?私はmesgFunction("A")を試して、そのメソッドが存在しないと訴えました。何か不足していますか?もっと短い選択肢はありませんか?

+0

これはラムダの良いユースケースのようではありません。あなたが本当にやろうとしていることですか? 'println'メソッドの' - > 'の右側にすべてを置くだけではどうですか? – Brick

+0

Scalaは実際にそれを行うので、希望があります。ですから、将来のリリースでは、lambdaにメソッド呼び出しの略式バージョンを取得することができます。 –

答えて

0

いいえ、そのような代替手段はありません。 apply()は、Functionインターフェイスのメソッドの「ちょうど」なので、そのメソッドを呼び出す必要があります。より簡潔にする構文糖はありません。

1

いいえ、インターフェイスが機能インターフェイスであるという事実は、代替の呼び出し構文を許可しません。メソッドは他のインタフェースメソッドと同様に呼び出されます。

しかし、あなたはちょうどしかし、これはまだ従来の

public static String getRequiredProperty(String name) { 
    String value = System.getProperty(name); 
    if(value == null) throw new IllegalArgumentException(
           "Property "+name+" is not set in the environment"); 
    return value; 
} 

String valueA = getRequiredProperty("A"); 
String valueB = getRequiredProperty("B"); 
に対して何ら利点を持っていない繰り返しコード

Function<String, Supplier<IllegalArgumentException>> f = name -> 
    () -> new IllegalArgumentException("Property "+name+" is not set in the environment"); 
String valueA = Optional.of("A").map(System::getProperty).orElseThrow(f.apply("A")); 
String valueB = Optional.of("B").map(System::getProperty).orElseThrow(f.apply("B")); 

を短縮するために、共通のコードの詳細を考慮することができます

は、コードの重複がないという利点があります(特に、定数"A"および"B")、偶発的な不一致の余地が少なくなります。

+0

なぜ、単にFunction getRequiredProperty =(name) - > Optional.ofNullable(System.getProperty(name))を持たないのですか?orElseThrow(() - > new IllegalArgumentException( "Property" + name + "は設定されていません)環境の中で))); '?次に、呼び出しは単に 'String valueA = getRequiredProperty.apply(" A ")'になります。 – randominstanceOfLivingThing

+0

自分自身で言う... 'getRequiredProperty(" A ")'の上で 'getRequiredProperty.apply(" A ")'と言っているのは何ですか? – Holger

+0

最初の答えは、プロパティ名を2回指定する必要がなくなるため、コードの重複が少なくなります。 – randominstanceOfLivingThing

関連する問題