diff --git a/src/main/java/io/takima/Roll.java b/src/main/java/io/takima/Roll.java
index 3e38468143d71a666ee8ab4f79f8608b82e8780e..305a4673cf1419827920085c10b83a85c0b5c3d9 100644
--- a/src/main/java/io/takima/Roll.java
+++ b/src/main/java/io/takima/Roll.java
@@ -1,6 +1,10 @@
 package io.takima;
 
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 import java.util.stream.IntStream;
+import java.util.stream.Stream;
 
 public record Roll(int d1, int d2, int d3, int d4, int d5) {
     public static Roll roll(int d1, int d2, int d3, int d4, int d5) {
@@ -10,4 +14,12 @@ public record Roll(int d1, int d2, int d3, int d4, int d5) {
     public IntStream toStream() {
         return IntStream.of(d1, d2, d3, d4, d5);
     }
+
+    public Stream<Map.Entry<Integer, Long>> countByDiceValueStream() {
+        return toStream()
+            .boxed()
+            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
+            .entrySet()
+            .stream();
+    }
 }
diff --git a/src/main/java/io/takima/Yatzy.java b/src/main/java/io/takima/Yatzy.java
index a3707012f8f247eba34492898928cf4d0a57ab57..20a86b0d074fd44cd92832266b2b68775c004138 100644
--- a/src/main/java/io/takima/Yatzy.java
+++ b/src/main/java/io/takima/Yatzy.java
@@ -1,10 +1,10 @@
 package io.takima;
 
-public final class Yatzy {
-    private final int[] dice;
+import java.util.Map;
 
-    public Yatzy(int d1, int d2, int d3, int d4, int d5) {
-        dice = new int[] { d1, d2, d3, d4, d5 };
+public final class Yatzy {
+    private Yatzy() {
+        // This his a utility class which only implements static methods
     }
 
     public static int chance(Roll roll) {
@@ -46,19 +46,12 @@ public final class Yatzy {
         return sumDiceThatMatchWithValue(roll, 6);
     }
 
-    public static int pair(int d1, int d2, int d3, int d4, int d5) {
-        int[] counts = new int[6];
-        counts[d1 - 1]++;
-        counts[d2 - 1]++;
-        counts[d3 - 1]++;
-        counts[d4 - 1]++;
-        counts[d5 - 1]++;
-        for (int at = 0; at != 6; at++) {
-            if (counts[6 - at - 1] >= 2) {
-                return (6 - at) * 2;
-            }
-        }
-        return 0;
+    public static int pair(Roll roll) {
+        return roll.countByDiceValueStream()
+            .filter(entry -> entry.getValue() >= 2)
+            .max(Map.Entry.comparingByKey())
+            .map(entry -> entry.getKey() * 2)
+            .orElse(0);
     }
 
     public static int twoPair(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 f2bb57eb03244b261e6fde8ba8c0be914ef40d6c..dd3857e8beabb9aa79705a1d8d92afa31829ff19 100644
--- a/src/test/java/io/takima/YatzyTest.java
+++ b/src/test/java/io/takima/YatzyTest.java
@@ -84,9 +84,9 @@ class YatzyTest {
     @Test
     void pairShouldSumTheTwoHighestMatchingPair() {
         assertAll(
-            () -> assertEquals(6, Yatzy.pair(3, 4, 3, 5, 6)),
-            () -> assertEquals(10, Yatzy.pair(5, 3, 3, 3, 5)),
-            () -> assertEquals(12, Yatzy.pair(5, 3, 6, 6, 5))
+            () -> assertEquals(6, Yatzy.pair(roll(3, 4, 3, 5, 6))),
+            () -> assertEquals(10, Yatzy.pair(roll(5, 3, 3, 3, 5))),
+            () -> assertEquals(12, Yatzy.pair(roll(5, 3, 6, 6, 5)))
         );
     }