ラムダとストリームを初めて使用しています。私は削除された重複してソートされ、フォーマットされたArrayListを印刷しようとしています。私は次のように動作することを知っている:私はリストを持っているADFJKLXZまたは任意のランダムな文字の出力を生成しますJavaのストリームでprintfを使用する
list.stream().distinct().forEach(System.out::print);
。しかし、私はのように見えるために私の出力は、D、F、J、K、L、X、Z
で何をしたい私はこの試みている:私は、私はおそらくまだいくつかの混乱があると思う
list.stream().distinct().forEach(System.out::printf("%s, ",));
をon :: なぜ上記のコードは機能しないのですか?それを修正するにはどうすればよいですか?
それは理にかなっている。したがって、::渡すべきパラメータがない場合にのみ使用できますか? –
メソッド参照は、シグネチャが呼び出されているメソッドによって予期される機能的インタフェースの型と一致する場合にのみ使用できます。この場合、 'forEach'はちょうど1つのパラメータを取る' Consumer'を必要とします。メソッド参照はメソッドの実際の呼び出しと意味的に等価ではなく、後で呼び出すことができる機能インタフェースの実装にのみ一致するため、メソッド参照は明示的なパラメータを渡すものではありません。 – rgettman
実際には、 'System.out :: println'という形式のメソッド参照を使用すると、メソッドが呼び出される' System.out'で見つかった 'PrintStream'インスタンスが既に値をバインドしています。したがって、メソッド参照は多くても1つの値にバインドでき、常にメソッドが呼び出されるオブジェクトになります。また、["System.out :: println'の等価ラムダ式は何ですか?"](http://stackoverflow.com/a/28025717/2711488) – Holger