小编Tor*_*hre的帖子

Java Stream API:寻找filterAndMap的优雅方式

过滤和映射流的默认"最佳做法"是

Stream<T> source;
// ...
Predicate<T> predicate; // = ...
Function<T, U> mapper; // = ...
Stream<U> dst = source
         .filter(predicate)
         .map(mapper);
Run Code Online (Sandbox Code Playgroud)

在许多软件项目中,您将达到必须在多个流上应用相同的过滤器和映射操作的程度.例如,类T的对象集合应该转换为U类对象的List,其中U是T的子类,我们只需要U的实例.所以可以写:

Collection<T> source;
// ...
List<U> dst = source.stream()
            .filter(U.class::isInstance)
            .map(U.class::cast)
            .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

为了概括这一点,我写了一个帮助方法,名为onlyInstancesOf:

static <T, U> Function<T, Stream<U>> onlyInstancesOf(Class<U> clazz) {
    return t -> clazz.isInstance(t)
            ? Stream.of(clazz.cast(t))
            : Stream.empty();
}
Run Code Online (Sandbox Code Playgroud)

然后,此方法用于flatMap:

List<U> dst = source.stream()
            .flatMap(onlyInstancesOf(U.class))
            .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

我经常使用的另一个功能是optionalPresent处理包含Optionals的流:

static <T> Function<Optional<T>, Stream<T>> optionalPresent() {
    return t -> t.map(Stream::of).orElse(Stream.empty());
}
Run Code Online (Sandbox Code Playgroud)

和用法:

Collection<Optional<T>> source; …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

7
推荐指数
1
解决办法
173
查看次数

标签 统计

java ×1

java-8 ×1

java-stream ×1