ICU-22116 Update CI job for ICU4J to use Java 8 instead of Java 7

See #2173
diff --git a/.github/workflows/icu_ci.yml b/.github/workflows/icu_ci.yml
index 76d77d9..90bce1e 100644
--- a/.github/workflows/icu_ci.yml
+++ b/.github/workflows/icu_ci.yml
@@ -30,8 +30,8 @@
            # Regex note: (?! ... ) is a negative lookahead. Succeed if the pattern is not present. 
           set +o pipefail && make doc 2>&1 | tee doxygen.log && ( ! grep -P 'warning:(?! .* file .?Doxyfile)' doxygen.log )
 
-  # Java7 ICU4J build and unit test
-  java7-icu4j-build-and-test:
+  # Java8 ICU4J build and unit test
+  java8-icu4j-build-and-test:
     runs-on: ubuntu-latest
     steps:
       - name: Checkout and setup
@@ -40,30 +40,10 @@
           lfs: true
       - name: Checkout lfs objects
         run: git lfs pull
-      - uses: actions/setup-java@v1
+      - uses: actions/setup-java@v3
         with:
+          distribution: 'temurin'
           java-version: '8'
-      - name: Cache for Java 7 tarball
-        id: cache-java7
-        uses: actions/cache@v2
-        with:
-          path: java7-tarball
-          key: ${{ runner.os }}-java7-tarball
-      - name: Download Java 7
-        if: steps.cache-java7.outputs.cache-hit != 'true'
-        run: |
-          mkdir -p java7-tarball
-          download_url="https://download.java.net/openjdk/jdk7u75/ri/openjdk-7u75-b13-linux-x64-18_dec_2014.tar.gz"
-          wget -O java7-tarball/java_package.tar.gz $download_url
-          pushd java7-tarball
-          gunzip java_package.tar.gz
-          tar xvf java_package.tar
-          popd
-      - name: Configure Ant build to use Java 7 JRE
-        run: |
-          echo "java7.bootclasspath" > $RUNNER_TEMP/draft
-          ls java7-tarball/java-se-7u75-ri/jre/lib/*.jar|paste -sd ":" - >> $RUNNER_TEMP/draft
-          paste -sd "=" < $RUNNER_TEMP/draft >  icu4j/build-local.properties
       - name: ICU4J
         run: |
           cd icu4j;
@@ -86,8 +66,9 @@
           lfs: true
       - name: Checkout lfs objects
         run: git lfs pull
-      - uses: actions/setup-java@v1
+      - uses: actions/setup-java@v3
         with:
+          distribution: 'temurin'
           java-version: '11'
       - name: ICU4J
         run: |
@@ -110,8 +91,9 @@
           lfs: true
       - name: Checkout lfs objects
         run: git lfs pull
-      - uses: actions/setup-java@v1
+      - uses: actions/setup-java@v3
         with:
+          distribution: 'temurin'
           java-version: '16'
       - name: ICU4J
         run: |
@@ -134,8 +116,9 @@
           lfs: true
       - name: Checkout lfs objects
         run: git lfs pull
-      - uses: actions/setup-java@v1
+      - uses: actions/setup-java@v3
         with:
+          distribution: 'temurin'
           java-version: '11'
       - name: Config LSTM and Rebuild data jar
         run: |
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/PluralRulesTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/PluralRulesTest.java
index a96071e..3a86e1f 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/PluralRulesTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/PluralRulesTest.java
@@ -29,11 +29,14 @@
 import java.util.Locale;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Objects;
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -429,15 +432,20 @@
         main: for (ULocale locale : factory.getAvailableULocales()) {
             PluralRules rules = factory.forLocale(locale);
             Map<String, PluralRules> keywordToRule = new HashMap<>();
-            Collection<DecimalQuantitySamples> samples = new LinkedHashSet<>();
 
+            // get the set of all rule samples from all of the keywords of the locale's rule
+            Set<DecimalQuantitySamples> samples =
+                    rules.getKeywords()
+                        .stream()
+                        .flatMap(keyword -> {
+                            return Arrays.stream(SampleType.values())
+                                    .map(sampleType -> rules.getDecimalSamples(keyword, sampleType));
+                        })
+                        .filter(Objects::nonNull)
+                        .collect(Collectors.toSet());
+
+            // take the rule substring per keyword, and create a map keyed by keyword for a new rules object of that rule substring
             for (String keyword : rules.getKeywords()) {
-                for (SampleType sampleType : SampleType.values()) {
-                    DecimalQuantitySamples samples2 = rules.getDecimalSamples(keyword, sampleType);
-                    if (samples2 != null) {
-                        samples.add(samples2);
-                    }
-                }
                 if (keyword.equals("other")) {
                     continue;
                 }
@@ -452,32 +460,35 @@
             }
 
             Map<DecimalQuantity, String> collisionTest = new LinkedHashMap();
-            for (DecimalQuantitySamples sample3 : samples) {
-                Set<DecimalQuantitySamplesRange> samples2 = sample3.getSamples();
-                if (samples2 == null) {
-                    continue;
-                }
-                for (DecimalQuantitySamplesRange sample : samples2) {
-                    for (int i = 0; i < 1; ++i) {
-                        DecimalQuantity item = i == 0 ? sample.start : sample.end;
-                        collisionTest.clear();
-                        for (Entry<String, PluralRules> entry : keywordToRule.entrySet()) {
-                            PluralRules rule = entry.getValue();
-                            String foundKeyword = rule.select(item);
-                            if (foundKeyword.equals("other")) {
-                                continue;
-                            }
-                            String old = collisionTest.get(item);
-                            if (old != null) {
-                                errln(locale + "\tNon-unique rules: " + item + " => " + old + " & " + foundKeyword);
-                                rule.select(item);
-                            } else {
-                                collisionTest.put(item, foundKeyword);
-                            }
-                        }
+
+            // get all of the sample ranges from all of the samples
+            Stream<DecimalQuantitySamplesRange> ranges = samples.stream()
+                .map(DecimalQuantitySamples::getSamples)
+                .filter(Objects::nonNull)
+                .flatMap(Set::stream);
+
+            // get all of the sample values at the endpoints of each sample range
+            Stream<DecimalQuantity> items = ranges.flatMap(range -> {
+                return Arrays.stream(new DecimalQuantity[] {range.start, range.end});
+            });
+
+            items.forEach(item -> {
+                collisionTest.clear();
+                for (Entry<String, PluralRules> entry : keywordToRule.entrySet()) {
+                    PluralRules rule = entry.getValue();
+                    String foundKeyword = rule.select(item);
+                    if (foundKeyword.equals("other")) {
+                        continue;
+                    }
+                    String old = collisionTest.get(item);
+                    if (old != null) {
+                        errln(locale + "\tNon-unique rules: " + item + " => " + old + " & " + foundKeyword);
+                        rule.select(item);
+                    } else {
+                        collisionTest.put(item, foundKeyword);
                     }
                 }
-            }
+            });
         }
     }