在Stream.generate()。forEach()

时间:2017-12-09 13:28:22

标签: java java-stream

System.out.println(GraphController.GRAPHPOOL.peek().getEdge());
    Stream.generate(() -> {
     try {
       return GraphController.GRAPHPOOL.take();
     } catch (InterruptedException ie) {
       return "Interrupted!";
     }
    })
    .forEach(g   -> {System.out.println(g.getEdge());}
    });

我可以打印EdgegetEdge返回的对象Stream.generate().forEach(),但是,forEach我只能访问对象g。< / p>

尝试访问g.getEdge()时,我收到如下错误:

  

error: cannot find symbol

     

System.out.println(g.getEdge());

     

symbol: method getEdge()

     

location: variable g of type Object

如何访问g.getEdge()

2 个答案:

答案 0 :(得分:2)

由于调用GraphController.GRAPHPOOL.take();不同的类型返回到语句return "Interrupted!",生成中间方法返回的元素都将为Object类型并且在getEdge()类中没有称为Object的方法。要解决这个问题,你可以做一些事情:

.forEach(g -> {
       if(g instanceof TheType){
           System.out.println(((TheType)g).getEdge());
       }
       else{
           // "interrupted"
       }
   });

另请注意,方法generate(Supplier<T> s) 会返回无限顺序流,通常在这种情况下,您需要利用limit来截断流。

答案 1 :(得分:0)

您必须将g强制转换为所希望的数据类型。如您所知,变量g目前是Object。只需使用(neededObjectforGetEdge(g)).getEdge()

进行投射即可