2017-09-19 14 views
1

私はJava8でストリームをテストしていて、非常に不満な問題を抱えています。Java8ストリームマップ()関数の追加の括弧

 List<String> words = Arrays.asList("Oracle", "Java", "Magazine"); 
    List<String> wordLengths = words.stream().map((x) -> { 
     x.toUpperCase(); 
    }).collect(Collectors.toList()); 

警告:

The method map(Function<? super String,? extends R>) in the type Stream<String> is not applicable for the arguments ((<no type> x) -> {}) 

これを何の警告を投げる

 List<String> words = Arrays.asList("Oracle", "Java", "Magazine"); 
    List<String> wordLengths = words.stream().map((x) -> x.toUpperCase()) 
     .collect(Collectors.toList()); 

2つ目(ほぼ同じ): 私はうまくコンパイルしたコードを持っています追加のかっこが変更されましたか?

+1

を使用することをお勧めします( https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-LambdaBody) –

+1

「警告」ではなくコンパイルの問題、*完全に別のもの – Eugene

答えて

3

ラムダ式は値を返します。あなたはブラケットを使用する場合は、あなたのラムダ関数にreturn文を追加する必要があります。

List<String> words = Arrays.asList("Oracle", "Java", "Magazine"); 
List<String> wordLengths = words.stream().map((x) -> { 
    return x.toUpperCase(); 
}).collect(Collectors.toList()); 
2

公式Oracle tutorial

によると、ラムダ式の構成は次のとおりです。

カンマ区切りカッコで囲まれた仮パラメータのリスト。 CheckPerson.testメソッドには、1つのパラメータpが含まれています。 はPerson classのインスタンスを表します。

注:パラメータのデータ型は、ラムダ の式で省略できます。さらに、1つのパラメータが の場合には、かっこは省略できます。たとえば、次のラムダ式も 有効です。

p -> p.getGender() == Person.Sex.MALE 
    && p.getAge() >= 18 
    && p.getAge() <= 25 

矢印トークン、->

単一の式またはステートメントのブロックで構成され、本体、。あなたが単一の式を指定した場合、

p.getGender() == Person.Sex.MALE 
    && p.getAge() >= 18 
    && p.getAge() <= 25 

その後、Javaランタイムは 式を評価し、その値を返します。 この例では、次の式を使用しています。また、あなたは return文を使用することができます

p -> { 
    return p.getGender() == Person.Sex.MALE 
     && p.getAge() >= 18 
     && p.getAge() <= 25; 
} 

return文は式ではありませんが。ラムダ式では、 は中括弧({})で囲む必要があります。ただし、 には、空のメソッド呼び出しを中括弧で囲む必要はありません。

email -> System.out.println(email) 

我々は括弧を省略することができます提供ラムダ式(x) -> x.toUpperCase()で唯一つのパラメータがありますので:x -> x.toUpperCase()は、たとえば、次のよう は、有効なラムダ式です。 String#toUpperCaseは新しいStringを返します。したがって、returnステートメントと中カッコを使用する必要はありません。代わりに、return文を持つ複雑なブロックがあった場合は、それを中括弧で囲む必要があります。また、この場合には、あなたがブラケットを使用しており、ラムダの戻り値の型がvoidでない場合は、ラムダ本体に `return`キーワードを供給するためにあなたを持っているMethod ReferenceString::toUpperCase

List<String> wordLengths = words.stream().map(String::toUpperCase).collect(Collectors.toList()); 
関連する問題