相关疑难解决方法(0)

复制流以避免"流已经被操作或关闭"

我想复制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)

java lambda java-8 java-stream

100
推荐指数
6
解决办法
5万
查看次数

是否可以使用一行将流收集到两个不同的集合?

我有以下代码:(为了勇敢而简化)

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 循环?

java java-stream

4
推荐指数
2
解决办法
7329
查看次数

Java流:flatMap返回对象流

我有这个代码:

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>>

有任何想法吗?

java java-stream

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

聚合两个以上的Java 8属性

我很简单

 class Per{
    int a;
    long b;
    double c;
    String d;
}
Run Code Online (Sandbox Code Playgroud)

假设我有3000个类型的对象Per并收集在一个List<Per> pers

现在我想实现: -

  • 如果跳过对象为空或dnullblank
  • 总和 a
  • 总和 b
  • 执行的操作的聚合值 c

老路是

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)

lambda field aggregate sum java-8

0
推荐指数
1
解决办法
122
查看次数

标签 统计

java ×3

java-stream ×3

java-8 ×2

lambda ×2

aggregate ×1

field ×1

sum ×1