[Java] [functional]将列表中的字段项收集到此类字段的列表中

时间:2018-04-01 18:12:53

标签: java list functional-programming

我有:

  • 表示棋盘上字段的类BoardField
  • 代表象棋兵,骑士,女王等西洋棋棋子的Chessman班。
  • 表示棋盘上所有西洋棋棋子的列表。

Class Chessman有一个BoardField类型的字段

我想获得例如职位的列表。所有白色骑士都在板上。

此代码将为我提供所有白骑士:

    chessmen.stream()
            .filter(chessman -> chessman.getSide().equals(Side.White))
            .filter(chessman -> chessman.getClass().equals(Knight.class))
    .collect(Collectors.toList());

只获得白骑士阵地的代码是什么?

以下

        chessmen.stream()
            .filter(chessman -> chessman.getSide().equals(Side.White))
            .filter(chessman -> chessman.getClass().equals(Knight.class))
            .collect(Collectors.toList())
            .stream()
            .forEach(chessman -> chessman.getField())
            .collect(Collectors.toList());

不起作用 - 第.collect(Collectors.toList());

上的编译错误

2 个答案:

答案 0 :(得分:1)

假设有Chessman::position返回BoardField,它应该像

一样简单
chessmen.stream()
        .filter(chessman -> chessman.getSide().equals(Side.White))
        .filter(chessman -> chessman.getClass().equals(Knight.class))
        .map(Chessman::position)
        .collect(Collectors.toList());

的简短形式
chessmen.stream()
        .filter(chessman -> chessman.getSide().equals(Side.White))
        .filter(chessman -> chessman.getClass().equals(Knight.class))
        .map(chessman -> chessman.position())
        .collect(Collectors.toList());

答案 1 :(得分:0)

不完全是一个答案只是指出我在代码中看到的错误是你无法打开流两次。在任何集合上打开流并应用终端操作后,它将无法重用。在这种情况下,终端操作是collect and foreach method

P.S。仍在等待50个声誉添加评论,所以只在答案部分添加评论