web-dev-qa-db-ja.com

Java 8 collect()only isPresent()Optional values

Java 8でこれを実際に達成するよりエレガントな方法はありますか?

_list.stream()
    .map(e -> myclass.returnsOptional(e))
    .filter(Optional::isPresent)
    .map(Optional::get)
    .collect(Collectors.toList());
_

filter(Optional::isPresent)に続いてmap(Optional::get)について話しているのですが、値を持つOptionalの結果のみをリストにエレガントに収集したいのです。

あなたの場合、flatMapmapと再びfilterの組み合わせの代わりに、1つのmapを使用できます。そのためには、ストリームを作成するための別の関数を定義することをお勧めします:public private static Stream<Integer> createStream(String e)は、ラムダ式に数行のコードが含まれないようにします。

デモの完全な例をご覧ください。

 public class Demo{
    public static void main(String[] args) {
        List<String> list = Arrays.asList("1", "2", "Hi Stack!", "not", "5");
        List<Integer> newList = list.stream()
                .flatMap(Demo::createStream)
                .collect(Collectors.toList());
        System.out.println(newList);
    }

    public static Stream<Integer> createStream(String e) {
        Optional<Integer> opt = MyClass.returnsOptional(e);
        return opt.isPresent() ? Stream.of(opt.get()) : Stream.empty();
    }
}


class MyClass {
    public static Optional<Integer> returnsOptional(String e) {
        try {
            return Optional.of(Integer.valueOf(e));
        } catch (NumberFormatException ex) {
            return Optional.empty();
        }
    }
}

returnsOptionalを静的にできない場合は、「method reference」の代わりに「arrow」式を使用する必要があります。

1
eGoLai