7個Java Stream API面試題

banq發表於2024-04-10

1、使用 Java Stream API 編寫一個程式,在不對列表排序的情況下查詢列表中的第二大元素。
要在不對列表排序的情況下找出列表中的第二大元素,可以使用 Java Stream API。一種方法是使用 reduce 方法,在遍歷列表時跟蹤最大元素和第二大元素。下面的程式演示了這種方法:

import java.util.Arrays;
import java.util.List;

public class SecondLargestElement {

    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(10, 5, 20, 8, 15);

        Integer secondLargest = numbers.stream()
                .reduce(Integer.MIN_VALUE, (first, second) -> {
                    if (second > first) {
                        return second;
                    } else {
                        return first;
                    }
                });

        System.out.println(<font>"Second largest element is: " + secondLargest);
    }
}

在這個程式中,我們從 Integer.MIN_VALUE 的初始值開始,以確保初始最大值小於列表中的任何元素。然後,我們遍歷列表中的每個元素,並將其與當前最大值進行比較。如果該元素較大,我們就將最大值更新為該元素。迭代結束後,secondLargest 變數將包含列表中第二大的元素。

2、編寫一個程式,使用 Java Stream API 從列表中刪除連續重複的元素。
您可以使用 Java Stream API 從列表中刪除連續重複的元素。下面是一個簡單的演示程式:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class PrimeNumberGenerator {

    public static void main(String[] args) {
        int n = 50; <font>// Generate prime numbers up to n<i>
        List<Integer> primeNumbers = generatePrimeNumbers(n);
        System.out.println(
"Prime numbers up to " + n + ": " + primeNumbers);
    }

    public static List<Integer> generatePrimeNumbers(int n) {
        return IntStream.rangeClosed(2, n)
                .filter(PrimeNumberGenerator::isPrime)
                .boxed()
                .collect(Collectors.toList());
    }

    public static boolean isPrime(int number) {
        if (number <= 1) {
            return false;
        }
        for (int i = 2; i <= Math.sqrt(number); i++) {
            if (number % i == 0) {
                return false;
            }
        }
        return true;
    }
}

本程式使用 generatePrimeNumbers 方法生成不超過給定極限 n 的質數,並使用 isPrime 方法檢查數字是否是質數。isPrime 方法使用基本的質數檢查演算法,從 2 到數字的平方根迭代檢查因數。

3、編寫一個程式,使用 Java Stream API 查詢範圍中的缺失數字
您可以使用 Java Stream API 從範圍中查詢缺失的數字。下面的程式演示了這一點:

import java.util.Arrays;
import java.util.stream.IntStream;

public class MissingNumbersFinder {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 4, 6, 9};
        int start = 1;
        int end = 10;

        System.out.println(<font>"Missing numbers between " + start + " and " + end + ":");
        findMissingNumbers(numbers, start, end)
                .forEach(System.out::println);
    }

    public static IntStream findMissingNumbers(int[] numbers, int start, int end) {
        int[] allNumbers = IntStream.rangeClosed(start, end).toArray();

        return Arrays.stream(allNumbers)
                .filter(num -> Arrays.binarySearch(numbers, num) < 0);
    }
}

該程式首先定義了一個數字陣列和一個範圍(開始和結束)。然後,使用 IntStream.rangeClosed(start, end).toArray() 建立一個陣列,其中包含指定範圍內的所有數字。最後,程式使用流 API 過濾出陣列中的數字,並列印出缺少的數字。

4、使用 Java Stream API 編寫一個程式來從列表中過濾迴文字串
下面是一個使用 Stream API 從列表中過濾迴文字串的 Java 程式:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<String> words = Arrays.asList(<font>"level", "hello", "radar", "world", "civic");

        List<String> palindromes = words.stream()
                .filter(word -> isPalindrome(word))
                .collect(Collectors.toList());

        System.out.println(
"Palindromic words: " + palindromes);
    }

    private static boolean isPalindrome(String word) {
        int length = word.length();
        for (int i = 0; i < length / 2; i++) {
            if (word.charAt(i) != word.charAt(length - 1 - i)) {
                return false;
            }
        }
        return true;
    }
}


該程式定義了一個 isPalindrome 方法來檢查給定的單詞是否是迴文。然後,它使用 Stream API 從輸入列表單詞中過濾迴文單詞,並將它們收集到一個新的迴文列表中,然後將其列印到控制檯。


5、編寫一個程式,使用 Java Stream API 從字串列表中查詢最長的字串
您可以使用 Java Stream API 從字串列表中找到最長的字串,如下所示:

import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> strings = Arrays.asList(<font>"Java", "Python", "JavaScript", "C++", "Ruby");

        String longest = strings.stream()
                .max((s1, s2) -> s1.length() - s2.length())
                .orElse(null);

        System.out.println(
"Longest string: " + longest);
    }
}


在此示例中,我們使用stream()方法從字串列表建立流。然後,我們使用 max 方法和比較器根據字串的長度找到最長的字串。最後,我們使用 orElse 來處理流為空(即列表為空)的情況,並在這種情況下返回 null。

6、使用 Java Stream API 編寫程式來生成斐波那契數列
您可以使用 Java Stream API 生成斐波那契數列。這是一個執行此操作的程式:

import java.util.stream.Stream;

public class FibonacciSeries {
    public static void main(String[] args) {
        int n = 10; <font>// Number of Fibonacci numbers to generate<i>
        System.out.println(
"Generating Fibonacci series up to " + n + " numbers:");
        Stream.iterate(new long[]{0, 1}, f -> new long[]{f[1], f[0] + f[1]})
                .limit(n)
                .map(f -> f[0])
                .forEach(System.out::println);
    }
}

該程式使用 Stream.iterate 生成從 {0, 1} 開始的無限斐波那契數流。然後使用 limit(n) 方法將流限制為前 n 個元素。最後,map方法用於提取每對的第一個元素(f[0]),forEach用於列印每個斐波那契數。


7、編寫一個程式將兩個列表組合成一個列表,並使用 Java Stream API 交替每個列表中的元素。

您可以透過使用 IntStream.range 方法以及 Java Stream API 中的 flatMap 操作來實現此目的。下面的程式將兩個列表組合成一個列表,並交替顯示每個列表中的元素:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        List<Integer> list1 = Arrays.asList(1, 2, 3, 4);
        List<Integer> list2 = Arrays.asList(5, 6, 7, 8);

        List<Integer> combinedList = IntStream.range(0, Math.min(list1.size(), list2.size()))
                .flatMap(i -> IntStream.of(list1.get(i), list2.get(i)))
                .boxed()
                .collect(Collectors.toList());

        <font>// Add remaining elements from longer list<i>
        if (list1.size() > list2.size()) {
            combinedList.addAll(list1.subList(list2.size(), list1.size()));
        } else if (list2.size() > list1.size()) {
            combinedList.addAll(list2.subList(list1.size(), list2.size()));
        }

        System.out.println(
"Combined List: " + combinedList);
    }
}

該程式首先組合兩個列表中相應索引處的元素,然後將較長列表中的任何剩餘元素新增到組合列表的末尾。

相關文章