【问题标题】:Filtering a source of custom datatype过滤自定义数据类型的来源
【发布时间】:2021-05-29 07:13:52
【问题描述】:

我正在学习 akka 流,并尝试使用我在下面编写的代码过滤源:

import akka.NotUsed;
import akka.actor.ActorSystem;
import akka.stream.javadsl.Sink;
import akka.stream.javadsl.Source;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletionStage;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;

public class sd001 {

    private static final ActorSystem system = ActorSystem.create("akkassembly");
    private static List<RData> ls = new ArrayList();

    private static class RData {
        private String id;

        public RData(String id){
            this.id = id;
        }

        public List<Integer> getValues(){
            return Arrays.asList(1,2,3,4,5);
        }

        public String getId() {
            return this.id;
        }
    }

    final static List<RData> builderFunction() {
        try {
            ls.add(new RData("1"));
            ls.add(new RData("2"));
            ls.add(new RData("3"));
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return ls;
    }

    private static double calculateAverage(List <Integer> marks) {
        return marks.stream()
                .mapToDouble(d -> d)
                .average()
                .orElse(0.0);
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {

        final Source<List<RData>, NotUsed> source =
                Source.repeat(NotUsed.getInstance()).map(elem -> builderFunction());
        source.filter(x -> x.getId().equals("1"));

    }

}

基本上,这段代码只是试图过滤List&lt;RData&gt; 类型的数据结构,但source.filter(x -&gt; x.getId().equals("1")); 行会导致编译器错误:

Cannot resolve method 'getId' in 'List' 

通过阅读过滤器的 akka 文档:https://doc.akka.io/docs/akka/current/stream/operators/Source-or-Flow/filter.html 我应该能够过滤列表值?

【问题讨论】:

  • 因为你得到的是List的流而不是RData的流

标签: java akka akka-stream


【解决方案1】:

使用mapConcat 扁平化集合似乎可以得到想要的结果:

 final Source<List<RData>, NotUsed> source =
                Source.repeat(NotUsed.getInstance()).map(elem -> builderFunction());
        source.mapConcat(i -> i)
                .filter(x -> x.getId().equals("1"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 2020-11-17
    • 2019-11-24
    相关资源
    最近更新 更多