6

私はflatMap OptionalJavaでsしようとしています。簡単な例を次に示します。

List<String> x = Arrays.asList("a", "b", "c");
List<String> result = x.stream().flatMap((val) -> val.equals("b") ? Optional.empty() : Optional.of(val)).collect(Collectors.toList());

コンパイラから次のエラー メッセージが表示されます。

Error:(10, 27) java: incompatible types: no instance(s) of type variable(s) T exist so that java.util.Optional<T> conforms to java.util.stream.Stream<? extends R>

どうしたの?これは、私が Scala で達成しようとしていることの例です。

List("a", "b", "c").flatMap(x => if (x == "b") None else Some(x))

戻り値:

res2: List[String] = List(a, c)

予想通り。

これをJavaに変換してコンパイルするにはどうすればよいですか?

4

2 に答える 2

6

flatMapStream入力の要素を別の にマップすることが期待されますStream。したがって、 ではなく を返す必要がありStreamますOptional

したがって、次のようにする必要があります。

List<String> x = Arrays.asList("a", "b", "c");
List<Optional<String>> result = 
    x.stream()
     .flatMap((val) -> 
                  val.equals("b") ? Stream.of(Optional.empty()) : 
                                    Stream.of(Optional.of(val)))
     .collect(Collectors.toList());

目標が単純に値の一部 (例では "b") を取り除くことである場合は、Optional を使用する必要はまったくないことに注意してください。Stream をフィルタリングするだけです:

List<String> result = 
    x.stream()
     .filter (val -> !val.equals("b"))
     .collect(Collectors.toList());

この方法は必要なくflatMap、出力はList<String>ではなく ですList<Optional<String>>

Holger がコメントしたように、各要素が単一の にマップされるため、の代わりに を使用することで、 のを返すソリューションを単純StreamOptionalできます。mapflatMapOptional

List<String> x = Arrays.asList("a", "b", "c");
List<Optional<String>> result = 
    x.stream()
     .map((val) -> val.equals("b") ? Optional.empty() : Optional.of(val))
     .collect(Collectors.toList());
于 2014-10-28T15:21:01.733 に答える
2

ここで対処する必要はありませんOptional

最も簡単で簡単な解決策は、使用することですfilter

List<String> result = x.stream()
    .filter(val -> !val.equals("b"))
    .collect(Collectors.toList());

の使用を主張する場合flatMapは、単にStream代わりに使用する必要がありOptionalます。

List<String> result = x.stream().flatMap(
    val -> val.equals("b")? Stream.empty(): Stream.of(val))
    .collect(Collectors.toList());

やむを得ず を生成する操作に対処する必要がある場合は、を使用Optionalするために に変換する必要があります。StreamStream.flatMap

List<String> result = x.stream()
    .map(val -> val.equals("b") ? Optional.<String>empty() : Optional.of(val))
    .flatMap(o->o.map(Stream::of).orElse(Stream.empty()))
    .collect(Collectors.toList());
于 2014-10-28T17:10:27.727 に答える