OSDN Git Service

apply lambda function to GameSummary.
authorOlyutorskii <olyutorskii@users.osdn.me>
Wed, 18 Mar 2020 15:49:21 +0000 (00:49 +0900)
committerOlyutorskii <olyutorskii@users.osdn.me>
Wed, 18 Mar 2020 15:49:21 +0000 (00:49 +0900)
src/main/java/jp/sfjp/jindolf/summary/GameSummary.java

index 0675e6d..e07b362 100644 (file)
@@ -22,6 +22,8 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 import jp.sfjp.jindolf.VerInfo;
 import jp.sfjp.jindolf.data.Avatar;
 import jp.sfjp.jindolf.data.InterPlay;
@@ -29,7 +31,6 @@ import jp.sfjp.jindolf.data.Period;
 import jp.sfjp.jindolf.data.Player;
 import jp.sfjp.jindolf.data.SysEvent;
 import jp.sfjp.jindolf.data.Talk;
-import jp.sfjp.jindolf.data.Topic;
 import jp.sfjp.jindolf.data.Village;
 import jp.sfjp.jindolf.dxchg.FaceIconSet;
 import jp.sfjp.jindolf.dxchg.WolfBBS;
@@ -110,27 +111,25 @@ public class GameSummary{
 
     /**
      * プレイヤーのリストから役職バランス文字列を得る。
-     * ex) "村村占霊狂狼"
+     *
+     * <p>ex) "村村占霊狂狼"
+     *
      * @param players プレイヤーのリスト
      * @return 役職バランス文字列
      */
     public static String getRoleBalanceSequence(List<Player> players){
-        List<GameRole> roleList = new LinkedList<>();
-        for(Player player : players){
-            GameRole role = player.getRole();
-            roleList.add(role);
-        }
-        Collections.sort(roleList, GameRole.getPowerBalanceComparator());
-
         StringBuilder result = new StringBuilder();
-        for(GameRole role : roleList){
-            char ch = role.getShortName();
-            result.append(ch);
-        }
+
+        players.stream()
+                .map(player -> player.getRole())
+                .sorted(GameRole.getPowerBalanceComparator())
+                .map(role -> role.getShortName())
+                .forEachOrdered(ch -> result.append(ch));
 
         return result.toString();
     }
 
+
     /**
      * サマライズ処理。
      */
@@ -141,9 +140,9 @@ public class GameSummary{
         summarizeTime();
         summarizeWinner();
 
-        for(Period period : this.village.getPeriodList()){
+        this.village.getPeriodList().forEach(period -> {
             summarizePeriod(period);
-        }
+        });
 
         summarizeJudge();
         summarizeGuard();
@@ -155,10 +154,10 @@ public class GameSummary{
      * SysEventの種別ごとに集計する。
      */
     private void buildEventMap(){
-        for(SysEventType type : SysEventType.values()){
-            List<SysEvent> eventList = new LinkedList<>();
-            this.eventMap.put(type, eventList);
-        }
+        Stream.of(SysEventType.values())
+                .forEach(type -> {
+                    this.eventMap.put(type, new LinkedList<>());
+                });
 
         this.village.getPeriodList().stream()
                 .flatMap(period -> period.getTopicList().stream())
@@ -239,67 +238,67 @@ public class GameSummary{
 
     /**
      * Periodのサマライズ。
+     *
      * @param period Period
      */
     private void summarizePeriod(Period period){
         int day = period.getDay();
-        for(Topic topic : period.getTopicList()){
-            if(topic instanceof SysEvent){
-                SysEvent sysEvent = (SysEvent) topic;
-                summarizeDestiny(day, sysEvent);
-            }
-        }
+
+        period.getTopicList().stream()
+                .filter(topic -> topic instanceof SysEvent)
+                .map(topic -> (SysEvent) topic)
+                .forEachOrdered(sysEvent -> {
+                    summarizeDestiny(day, sysEvent);
+                });
 
         return;
     }
 
     /**
      * 各プレイヤー運命のサマライズ。
+     *
      * @param day 日
      * @param sysEvent システムイベント
      */
     private void summarizeDestiny(int day, SysEvent sysEvent){
-        List<Avatar>  avatarList  = sysEvent.getAvatarList();
-        List<Integer> integerList = sysEvent.getIntegerList();
-
-        int avatarTotal = avatarList.size();
-        Avatar lastAvatar = null;
-        if(avatarTotal > 0) lastAvatar = avatarList.get(avatarTotal - 1);
+        List<Avatar> deadAvatars = new LinkedList<>();
+        Destiny destiny;
 
         SysEventType eventType = sysEvent.getSysEventType();
+
         switch(eventType){
+        case COUNTING:   // G国COUNTING2は運命に関係なし
         case EXECUTION:  // G国のみ
-            Avatar executed = sysEvent.getExecutedAvatar();
-            if(executed == null) break;
-            Player executedPl = registPlayer(executed);
-            executedPl.setDestiny(Destiny.EXECUTED);
-            executedPl.setObitDay(day);
+            Avatar executedAvatar = sysEvent.getExecutedAvatar();
+            if(executedAvatar == null) return;
+            deadAvatars.add(executedAvatar);
+            destiny = Destiny.EXECUTED;
             break;
         case SUDDENDEATH:
+            List<Avatar>  avatarList = sysEvent.getAvatarList();
             Avatar suddenDeathAvatar = avatarList.get(0);
-            Player suddenDeathPlayer = registPlayer(suddenDeathAvatar);
-            suddenDeathPlayer.setDestiny(Destiny.SUDDENDEATH);
-            suddenDeathPlayer.setObitDay(day);
-            break;
-        case COUNTING:  // G国COUNTING2は運命に関係なし
-            Avatar victim = sysEvent.getExecutedAvatar();
-            if(victim == null) break;
-            Player executedPlayer = registPlayer(victim);
-            executedPlayer.setDestiny(Destiny.EXECUTED);
-            executedPlayer.setObitDay(day);
+            deadAvatars.add(suddenDeathAvatar);
+            destiny = Destiny.SUDDENDEATH;
             break;
         case MURDERED:
-            for(Avatar avatar : avatarList){
-                Player player = registPlayer(avatar);
-                player.setDestiny(Destiny.EATEN);
-                player.setObitDay(day);
-            }
             // TODO E国ハム溶け処理は後回し
+            sysEvent.getAvatarList().stream()
+                    .forEach(avatar -> {
+                        deadAvatars.add(avatar);
+                    });
+            destiny = Destiny.EATEN;
             break;
         default:
-            break;
+            return;
         }
 
+        deadAvatars.stream()
+                .map(avatar -> getPlayer(avatar))
+                .forEach(player -> {
+                    player.setDestiny(destiny);
+                    player.setObitDay(day);
+                });
+
         return;
     }
 
@@ -307,21 +306,17 @@ public class GameSummary{
      * 会話時刻のサマライズ。
      */
     private void summarizeTime(){
-        for(Period period : this.village.getPeriodList()){
-            for(Topic topic : period.getTopicList()){
-                if( ! (topic instanceof Talk) ) continue;
-                Talk talk = (Talk) topic;
-
-                long epoch = talk.getTimeFromID();
-
-                if(this.talk1stTimeMs  < 0) this.talk1stTimeMs  = epoch;
-                if(this.talkLastTimeMs < 0) this.talkLastTimeMs = epoch;
-
-                if(epoch < this.talk1stTimeMs ) this.talk1stTimeMs  = epoch;
-                if(epoch > this.talkLastTimeMs) this.talkLastTimeMs = epoch;
-            }
-        }
-
+        this.village.getPeriodList().stream()
+                .flatMap(period -> period.getTopicList().stream())
+                .filter(topic -> topic instanceof Talk)
+                .mapToLong(topic -> ((Talk) topic).getTimeFromID())
+                .forEach(epoch -> {
+                    if(this.talk1stTimeMs  < 0) this.talk1stTimeMs  = epoch;
+                    if(this.talkLastTimeMs < 0) this.talkLastTimeMs = epoch;
+
+                    if(epoch < this.talk1stTimeMs ) this.talk1stTimeMs  = epoch;
+                    if(epoch > this.talkLastTimeMs) this.talkLastTimeMs = epoch;
+                });
         return;
     }
 
@@ -350,6 +345,7 @@ public class GameSummary{
 
     /**
      * 占い師の活動を文字列化する。
+     *
      * @return 占い師の活動
      */
     public CharSequence dumpSeerActivity(){
@@ -411,15 +407,16 @@ public class GameSummary{
             }
         }
 
-        for(Period period : this.village.getPeriodList()){
+        this.village.getPeriodList().forEach(period -> {
             summarizeGjPeriod(period);
-        }
+        });
 
         return;
     }
 
     /**
      * 狩人GJの日ごとの集計。
+     *
      * @param period 日
      */
     private void summarizeGjPeriod(Period period){
@@ -477,6 +474,7 @@ public class GameSummary{
 
     /**
      * 狩人の活動を文字列化する。
+     *
      * @return 狩人の活動
      */
     public CharSequence dumpHunterActivity(){
@@ -550,6 +548,7 @@ public class GameSummary{
 
     /**
      * 処刑概観を文字列化する。
+     *
      * @return 文字列化した処刑概観
      */
     public CharSequence dumpExecutionInfo(){
@@ -589,6 +588,7 @@ public class GameSummary{
 
     /**
      * 襲撃概観を文字列化する。
+     *
      * @return 文字列化した襲撃概観
      */
     public CharSequence dumpAssaultInfo(){
@@ -628,23 +628,28 @@ public class GameSummary{
 
     /**
      * まとめサイト用投票Boxを生成する。
+     *
      * @return 投票BoxのWikiテキスト
      */
     public CharSequence dumpVoteBox(){
         StringBuilder wikiText = new StringBuilder();
 
-        for(Player player : getCastingPlayerList()){
-            Avatar avatar = player.getAvatar();
-            if(avatar == Avatar.AVATAR_GERD) continue;
-            GameRole role = player.getRole();
-            CharSequence fullName = avatar.getFullName();
-            CharSequence roleName = role.getRoleName();
-            StringBuilder line = new StringBuilder();
-            line.append("[").append(roleName).append("] ").append(fullName);
-            if(wikiText.length() > 0) wikiText.append(',');
-            wikiText.append(WolfBBS.escapeWikiSyntax(line));
-            wikiText.append("[0]");
-        }
+        getCastingPlayerList().stream()
+                .filter(player ->
+                        ! player.getAvatar().equals(Avatar.AVATAR_GERD)
+                )
+                .forEach(player -> {
+                    Avatar avatar = player.getAvatar();
+                    GameRole role = player.getRole();
+                    CharSequence fullName = avatar.getFullName();
+                    CharSequence roleName = role.getRoleName();
+                    StringBuilder line = new StringBuilder();
+                    line.append("[").append(roleName).append("] ")
+                            .append(fullName);
+                    if(wikiText.length() > 0) wikiText.append(',');
+                    wikiText.append(WolfBBS.escapeWikiSyntax(line));
+                    wikiText.append("[0]");
+                });
 
         wikiText.insert(0, "#vote(").append(")\n");
 
@@ -653,6 +658,7 @@ public class GameSummary{
 
     /**
      * まとめサイト用キャスト表を生成する。
+     *
      * @param iconSet 顔アイコンセット
      * @return キャスト表のWikiテキスト
      */
@@ -801,6 +807,7 @@ public class GameSummary{
 
     /**
      * 村詳細情報を出力する。
+     *
      * @return 村詳細情報
      */
     public CharSequence dumpVillageWiki(){
@@ -903,6 +910,7 @@ public class GameSummary{
 
     /**
      * 最初の発言の時刻を得る。
+     *
      * @return 時刻
      */
     public Date get1stTalkDate(){
@@ -911,6 +919,7 @@ public class GameSummary{
 
     /**
      * 最後の発言の時刻を得る。
+     *
      * @return 時刻
      */
     public Date getLastTalkDate(){
@@ -919,6 +928,7 @@ public class GameSummary{
 
     /**
      * 指定した日の生存者一覧を得る。
+     *
      * @param day 日
      * @return 生存者一覧
      */
@@ -938,32 +948,34 @@ public class GameSummary{
         }
 
         if(period.isEpilogue()){
-            for(Player player : this.playerList){
-                if(player.getDestiny() == Destiny.ALIVE){
-                    result.add(player);
-                }
-            }
+            this.playerList.stream()
+                    .filter(player -> player.getDestiny() == Destiny.ALIVE)
+                    .forEachOrdered(player -> {
+                        result.add(player);
+                    });
             return result;
         }
 
-        for(Topic topic : period.getTopicList()){
-            if( ! (topic instanceof SysEvent) ) continue;
-            SysEvent sysEvent = (SysEvent) topic;
-            if(sysEvent.getSysEventType() == SysEventType.SURVIVOR){
-                List<Avatar> avatarList = sysEvent.getAvatarList();
-                for(Avatar avatar : avatarList){
+        period.getTopicList().stream()
+                .filter(topic -> topic instanceof SysEvent)
+                .map(topic -> (SysEvent) topic)
+                .filter(sysEvent ->
+                        sysEvent.getSysEventType() == SysEventType.SURVIVOR
+                )
+                .flatMap(sysEvent -> sysEvent.getAvatarList().stream())
+                .forEachOrdered(avatar -> {
                     Player player = getPlayer(avatar);
                     result.add(player);
-                }
-            }
-        }
+                });
 
         return result;
     }
 
     /**
      * プレイヤー一覧を得る。
-     * 参加エントリー順
+     *
+     * <p>参加エントリー順
+     *
      * @return プレイヤーのリスト
      */
     public List<Player> getPlayerList(){
@@ -973,6 +985,7 @@ public class GameSummary{
 
     /**
      * キャスティング表用にソートされたプレイヤー一覧を得る。
+     *
      * @return プレイヤーのリスト
      */
     public List<Player> getCastingPlayerList(){
@@ -985,23 +998,20 @@ public class GameSummary{
 
     /**
      * 指定された役職のプレイヤー一覧を得る。
+     *
      * @param role 役職
      * @return 役職に合致するプレイヤーのリスト
      */
     public List<Player> getRoledPlayerList(GameRole role){
-        List<Player> result = new LinkedList<>();
-
-        for(Player player : this.playerList){
-            if(player.getRole() == role){
-                result.add(player);
-            }
-        }
-
+        List<Player> result = this.playerList.stream()
+                .filter(player -> player.getRole() == role)
+                .collect(Collectors.toList());
         return result;
     }
 
     /**
      * 勝利陣営を得る。
+     *
      * @return 勝利した陣営
      */
     public Team getWinnerTeam(){
@@ -1010,18 +1020,21 @@ public class GameSummary{
 
     /**
      * 突然死者数を得る。
+     *
      * @return 突然死者数
      */
     public int countSuddenDeath(){
-        int suddenDeath = 0;
-        for(Player player : this.playerList){
-            if(player.getDestiny() == Destiny.SUDDENDEATH) suddenDeath++;
-        }
-        return suddenDeath;
+        long suddenDeath = this.playerList.stream()
+                .filter(player -> player.getDestiny() == Destiny.SUDDENDEATH)
+                .count();
+
+        int result = (int) suddenDeath;
+        return result;
     }
 
     /**
      * 参加プレイヤー総数を得る。
+     *
      * @return プレイヤー総数
      */
     public int countAvatarNum(){
@@ -1031,7 +1044,9 @@ public class GameSummary{
 
     /**
      * AvatarからPlayerを得る。
-     * 参加していないAvatarならnullを返す。
+     *
+     * <p>参加していないAvatarならnullを返す。
+     *
      * @param avatar Avatar
      * @return Player
      */
@@ -1041,24 +1056,9 @@ public class GameSummary{
     }
 
     /**
-     * AvatarからPlayerを得る。
-     * 無ければ新規に作る。
-     * @param avatar Avatar
-     * @return Player
-     */
-    private Player registPlayer(Avatar avatar){
-        Player player = getPlayer(avatar);
-        if(player == null){
-            player = new Player();
-            player.setAvatar(avatar);
-            this.playerMap.put(avatar, player);
-        }
-        return player;
-    }
-
-    /**
      * プレイヤーのソート仕様の記述。
-     * まとめサイトのキャスト表向け。
+     *
+     * <p>まとめサイトのキャスト表向け。
      */
     private static final class CastingComparator
             implements Comparator<Player> {
@@ -1073,6 +1073,7 @@ public class GameSummary{
 
         /**
          * {@inheritDoc}
+         *
          * @param p1 {@inheritDoc}
          * @param p2 {@inheritDoc}
          * @return {@inheritDoc}