Chr*_*jer 4 java collections java-8 java-stream
在Java 8中,使用包java.util.function
和java.util.stream
新语言功能lambda和方法引用,将a Stream<Collection<T>>
转换为a 的最佳方法是Stream<T>
什么?
这是我到目前为止找到的解决方案的例子,但我对此并不满意.为了创建一个Stream<T>
来自a Stream<Collection<T>>
,我使用collect().stream()
一个中间HashSet
(我Collection
是一个Set
).
import java.security.Provider;
import java.util.HashSet;
import static java.lang.System.out;
import static java.security.Security.getProviders;
import static java.security.Provider.Service;
import static java.util.Arrays.stream;
public class ListMessageDigests {
public static void main(final String... args) {
stream(getProviders())
.map(Provider::getServices)
.collect(HashSet<Service>::new, HashSet::addAll, HashSet::addAll)
.stream()
.filter(service -> "MessageDigest".equals(service.getType()))
.map(Service::getAlgorithm)
.sorted()
.forEach(out::println);
}
}
Run Code Online (Sandbox Code Playgroud)
是否有更优雅的方式将a转换Stream<Collection<T>>
为Stream<T>
?就像Stream<Set<Service>>
在这个例子中成了一个Stream<Service>
?我不开心与使用中间HashSet
和.collect().stream()
,感觉复杂的给我.
PS:我知道我可以简单地做到这一点:
import static java.security.Security.getAlgorithms;
public class ListMessageDigests {
public static void main(final String... args) {
getAlgorithms("MessageDigest")
.forEach(out::println);
}
}
Run Code Online (Sandbox Code Playgroud)
我只是使用getProviders()
并getServices
快速构建Stream<Set<Service>>
一个Stream<Collection<T>>
来展示问题.
你可以用flatMap
与Collection#stream
<T> Stream<T> flatten(Stream<? extends Collection<? extends T>> stream){
return stream.flatMap(Collection::stream);
}
Run Code Online (Sandbox Code Playgroud)
最终的代码如下所示:
import static java.lang.System.out;
import static java.security.Provider.Service;
import static java.security.Security.getProviders;
import static java.util.Arrays.stream;
public class ListMessageDigests {
public static void main(final String... args) {
stream(getProviders())
.flatMap(p -> p.getServices().stream())
.distinct()
.filter(service -> "MessageDigest".equals(service.getType()))
.map(Service::getAlgorithm)
.sorted()
.forEach(out::println);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果不调用distinct
它,可能不会产生与您的示例具有完全相同元素的流,因为收集到集合将删除重复项(如果有).
归档时间: |
|
查看次数: |
795 次 |
最近记录: |