diff --git a/src/main/java/io/takima/Yatzy.java b/src/main/java/io/takima/Yatzy.java
index 54a0a2186838fa097f37c74617a2f6bc9ef22d6f..0b594f00b56962aba16fd24904c762ef38c48169 100644
--- a/src/main/java/io/takima/Yatzy.java
+++ b/src/main/java/io/takima/Yatzy.java
@@ -66,20 +66,12 @@ public final class Yatzy {
         return pairs.get(0) + pairs.get(1);
     }
 
-    public static int fourOfAKind(int d1, int d2, int d3, int d4, int d5) {
-        int[] counts;
-        counts = new int[6];
-        counts[d1 - 1]++;
-        counts[d2 - 1]++;
-        counts[d3 - 1]++;
-        counts[d4 - 1]++;
-        counts[d5 - 1]++;
-        for (int i = 0; i < 6; i++) {
-            if (counts[i] >= 4) {
-                return (i + 1) * 4;
-            }
-        }
-        return 0;
+    public static int fourOfAKind(Roll roll) {
+        return roll.countByDiceValueStream()
+            .filter(entry -> entry.getValue() >= 4)
+            .max(Map.Entry.comparingByKey())
+            .map(entry -> entry.getKey() * 4)
+            .orElse(0);
     }
 
     public static int threeOfAKind(int d1, int d2, int d3, int d4, int d5) {
diff --git a/src/test/java/io/takima/YatzyTest.java b/src/test/java/io/takima/YatzyTest.java
index b663f692a4d1ccaad7e91c655252e19d51308a3d..18c976255abebc9341e5fdbe800495056e8f3595 100644
--- a/src/test/java/io/takima/YatzyTest.java
+++ b/src/test/java/io/takima/YatzyTest.java
@@ -108,7 +108,8 @@ class YatzyTest {
         assertAll(
             () -> assertEquals(9, Yatzy.threeOfAKind(3, 3, 3, 4, 5)),
             () -> assertEquals(15, Yatzy.threeOfAKind(5, 3, 5, 4, 5)),
-            () -> assertEquals(9, Yatzy.threeOfAKind(3, 3, 3, 3, 5))
+            () -> assertEquals(9, Yatzy.threeOfAKind(3, 3, 3, 3, 5)),
+            () -> assertEquals(9, Yatzy.threeOfAKind(3, 3, 3, 3, 3))
         );
     }
 
@@ -120,15 +121,15 @@ class YatzyTest {
     @Test
     void fourOfAKindShouldSumTheFourDiceWithTheSameValue() {
         assertAll(
-            () -> assertEquals(12, Yatzy.fourOfAKind(3, 3, 3, 3, 5)),
-            () -> assertEquals(20, Yatzy.fourOfAKind(5, 5, 5, 4, 5)),
-            () -> assertEquals(9, Yatzy.threeOfAKind(3, 3, 3, 3, 3))
+            () -> assertEquals(12, Yatzy.fourOfAKind(roll(3, 3, 3, 3, 5))),
+            () -> assertEquals(20, Yatzy.fourOfAKind(roll(5, 5, 5, 4, 5))),
+            () -> assertEquals(12, Yatzy.fourOfAKind(roll(3, 3, 3, 3, 3)))
         );
     }
 
     @Test
     void fourOfAKindShouldReturnZeroIfThereIsNoFourDiceWithTheSameValue() {
-        assertEquals(0, Yatzy.fourOfAKind(2, 2, 2, 5, 5));
+        assertEquals(0, Yatzy.fourOfAKind(roll(2, 2, 2, 5, 5)));
     }
 
     @Test