在Java中,可以轻松地生成无限流Stream.generate(supplier).但是,我需要生成一个最终完成的流.
想象一下,例如,我想要一个目录中所有文件的流.文件数量可能很大,因此我无法预先收集所有数据并从中创建流(via collection.stream()).我需要逐个生成序列.但是流很明显会在某个时刻完成,终端运营商喜欢(collect()或findAny())需要对它进行处理,因此Stream.generate(supplier)不适合这里.
有没有合理的简单方法在Java中执行此操作,而不是自己实现整个Stream接口?
我可以想到一个简单的黑客 - 用无限做它Stream.generate(supplier),并在获取所有实际值时提供null或抛出异常.但是它会破坏标准的流操作符,我只能将它用于我自己的操作符,这些操作符都知道这种行为.
澄清
评论中的人提议我takeWhile()操作员.这不是我的意思.如何更好地表达问题...我不是在问如何过滤(或限制)现有的流,我问如何动态创建(生成)流,而不是先加载所有元素,但是流会有有限的大小(事先未知).
解
我正在寻找的代码是
Iterator it = myCustomIteratorThatGeneratesTheSequence();
StreamSupport.stream(Spliterators.spliteratorUnknownSize(it, Spliterator.DISTINCT), false);
Run Code Online (Sandbox Code Playgroud)
我刚看了一下java.nio.file.Files,该list(path)方法是如何实现的.
我有一个流,想检查是否所有匹配过滤器.如果全部匹配,则返回true.
但是,如果流是空的,我想回来false.
我怎样才能做到这一点?
示例代码:
public boolean validate(Stream<Whatever> stream) {
// Problem: returns **true** if stream empty.
// How can **false** be returned if stream is empty?
return stream.allMatch(Whatever::someCheck);
}
Run Code Online (Sandbox Code Playgroud) 我想知道我何时创建自己的无限流,Stream.generate标准库中的Streams如何停止...
例如,当您有一个包含记录的列表时:
List<Record> records = getListWithRecords();
records.stream().forEach(/* do something */);
Run Code Online (Sandbox Code Playgroud)
流不会无限并且永远运行,但是当遍历列表中的所有项时它将停止.但是这有什么作用呢?相同的功能适用于由Files.lines(path)(源:http://www.mkyong.com/java8/java-8-stream-read-a-file-line-by-line/)创建的流.
第二个问题,如何Stream.generate以相同的方式停止创建流?
我有一个未排序的整数数组,其中的值范围从 Integer.MIN_VALUE 到 Integer.MAX_VALUE。数组中的任何整数都可以有多个副本。我需要返回一个删除了所有重复项的数组,并保持元素的顺序。
例子:
int[] input = {7,8,7,1,9,0,9,1,2,8}
Run Code Online (Sandbox Code Playgroud)
输出应为 {7,8,1,9,0,2}
我知道这个问题可以通过使用来解决,LinkedHashSet但我需要一个不涉及大量缓冲区空间的解决方案。
我正在慢慢学习Java 8的新功能,并试图找到一种以流方式处理类层次结构(从子级到父级)的方法。
例如,在类或其父级上找到注释。
在Java 8之前,我会这样完成:
public static <T extends Annotation> T getAnnonationOn(Class<?> type, Class<T> annType) {
Class<?> t = type;
T annot = null;
while (t != null && annot == null) {
annot = t.getAnnotation(annType);
t = t.getSuperclass();
}
return annot;
}
Run Code Online (Sandbox Code Playgroud)
现在,我希望以一种更加“功能性的编程”方式来做到这一点。我找不到比使用以下递归连接流更好的方法:
import java.lang.annotation.Annotation;
import java.util.stream.Stream;
public static <T extends Annotation> T getAnnonationOn(Class<?> type, Class<T> annType) {
return ClassIterator.streamSuperclass(type)
.map(t -> t.getAnnotation(annType))
.filter(a -> a != null)
.findFirst()
.orElse(null);
}
public static class ClassIterator {
public static Stream<Class<?>> …Run Code Online (Sandbox Code Playgroud)