我想复制Java 8流,以便我可以处理它两次.我可以collect作为一个列表并从中获得新的流;
// doSomething() returns a stream
List<A> thing = doSomething().collect(toList());
thing.stream()... // do stuff
thing.stream()... // do other stuff
Run Code Online (Sandbox Code Playgroud)
但我认为应该有一种更有效/更优雅的方式.
有没有办法复制流而不将其转换为集合?
我实际上正在使用Eithers 流,所以想要在移动到正确的投影之前以一种方式处理左投影并以另一种方式处理.有点像这样(到目前为止,我被迫使用这个toList技巧).
List<Either<Pair<A, Throwable>, A>> results = doSomething().collect(toList());
Stream<Pair<A, Throwable>> failures = results.stream().flatMap(either -> either.left());
failures.forEach(failure -> ... );
Stream<A> successes = results.stream().flatMap(either -> either.right());
successes.forEach(success -> ... );
Run Code Online (Sandbox Code Playgroud) 我有以下代码:(为了勇敢而简化)
public void search(Predicate<String> predicate, Elements elements)
{
List<SearchResult> searchResults = elements.stream()
.filter(element -> predicate.test(element.ownText()))
.map(element -> new SearchResult(element.ownText(), element.baseUri(),element.tagName()))
.collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)
但是现在,我想要另一个列表,该列表将包含没有映射的所有过滤元素。是否可以使用流来做到这一点,或者我应该为此更改为 foreach 循环?
我有这个代码:
List<Application> applications = this.applicationDao.findAll();
Collection<Pair<Application, FileObject>> files = applications.stream()
.flatMap(app -> streamOfFiles.map(file -> Pair.of(app, file)));
Run Code Online (Sandbox Code Playgroud)
这里streamOfFiles是一个Stream<FileObject>
目前,我收到此编译消息:
类型不匹配:无法转换
Stream<Object>为Collection<Pair<Application,FileObject>>
有任何想法吗?
我很简单
class Per{
int a;
long b;
double c;
String d;
}
Run Code Online (Sandbox Code Playgroud)
假设我有3000个类型的对象Per并收集在一个List<Per> pers
现在我想实现: -
d为null或blankabc老路是
int totalA = 0; long totalB = 0l; long totalC = 0l;
for (Per per : pers) {
if (per.d != null && !per.d.trim().equals("")) {
totalA += per.a;
totalB += per.b;
totalC += someOperation(per.c);
}
}
Run Code Online (Sandbox Code Playgroud)
someOperation 实施并不重要,因为它可能简单或复杂.
如何通过Java8流和lambda表达式实现这一目标?
一个可能的答案是这样的
int totalA = 0; long totalB=0l;
pers.stream().filter(p->{
if(p …Run Code Online (Sandbox Code Playgroud)