函数式接口

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。

函数式接口可以被隐式转换为 Lambda 表达式。

如定义了一个函数接口如下:

public interface PlayerAction {
    void action(Player player);
}

在我们的PlayerServiceImpl上我们定义变量playerMap用来保存所有玩家的<ID,Player>信息。 同时我们再定义一个方法actionForEachPlayer用来遍历所有玩家,进行PlayerAction的action操作。

@Service
public class PlayerServiceImpl{
    // 其他属性...
    private Map<Long, Player> playerMap = new ConcurrentHashMap<>();
    // 其他方法...
    public void actionForEachPlayer(PlayerAction playerAction) {
      Iterator<Player> iterator = this.playerMap.values().iterator();
      while (iterator.hasNext()) {
        Player player = iterator.next();
        try {
          playerAction.action(player);
        } catch (Exception ex) {
          ex.printStackTrace();
        }
      }
    }
}

正常情况下我们在调用actionForEachPlayer时,可能需要先PlayerAction action = new PlayerAction(),然后将action传给函数。 但是利用函数接口,我们可以简化在对玩家进行全服发奖,全服推送活动,全服等等行为操作,而不需要去挨个创建PlayerAction实例。 例如另一个类里有如下方法:

private void pushNewActivity(Activity activity) {
        try {
            playerService.actionForEachPlayer(player -> {
                try {
                    if (player == null) {
                        return;
                    }
                    player.Send(activity);
                } catch (Exception e) {
                    // do something
                }
            });
        } catch (Exception e) {
            // do somethong
        }
    }

进行其他全服操作时,我们只需要单独几行类似pushNewActivity里的代码,就可以实现各种操作。