簡體   English   中英

帶有使用者或過濾器的Java8的List的條件,哪種方式更好

[英]Conditions for a List with Java8 with Consumer or Filter, which way is better

我試過這個

    List<Integer> numbers = Arrays.asList(1, 1, 0, -1, -1);
    List<Integer> positiveNum2 = new ArrayList<>();
    List<Integer> negativeNum2 = new ArrayList<>();
    List<Integer> zeroNumbers2 = new ArrayList<>();
    List<Integer> positiveNumbers = numbers.stream().filter(number -> number > 0).collect(Collectors.toList());
    List<Integer> negativeNumbers = numbers.stream().filter(number -> number < 0).collect(Collectors.toList());
    List<Integer> zeroNumbers = numbers.stream().filter(number -> number.equals(0)).collect(Collectors.toList());
    positiveNumbers.forEach(System.out::println);
    negativeNumbers.forEach(System.out::println);
    zeroNumbers.forEach(System.out::println);
    System.out.println("*********with Consumer******************");
    Consumer<Integer> determineNumber = number -> {
        if (number > 0) {
            positiveNum2.add(number);
        } else if (number < 0) {
            negativeNum2.add(number);
        } else {
            zeroNumbers2.add(number);
        }

    };
    numbers.forEach(determineNumber);
    positiveNum2.forEach(System.out::println);
    negativeNum2.forEach(System.out::println);
    zeroNumbers2.forEach(System.out::println);

但我不知道哪一個更好,我認為forEach與消費者,但消費者進行三次驗證,因此,沒有單一的責任

我通常更喜歡基於Consumer的解決方案,因為它至少將整個操作封裝在一個調用/流中。 但我認為你還沒有充分利用流的功能方法。

您可以使用簡單的流/收集來實現此排序:

numbers .stream()
        .collect(Collectors.groupingBy(Math::signum));

將導致這樣的地圖:

{1.0=[1], 0.0=[0, 0], -1.0=[-1, -2, -1]}

這種方法避免了副作用(即不修改流范圍之外的列表),因此可以更容易地提取並且易於並行運行。

消費者只需要一個迭代,所以它的效率更高,而且它有一個責任:將數字還將基於他們的標志三個列表。

對於這種情況,我可能會使用一個簡單的for循環。

如果你真的想要過度設計,你可以定義一個enum來表示符號,並使用分組收集器分組到一個地圖中:

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

import static java.util.stream.Collectors.groupingBy;

public class Test {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 1, 0, -1, -1);

        Map<Sign, List<Integer>> map = numbers
                .stream()
                .collect(groupingBy(i -> i > 0
                                    ? Sign.POSITIVE
                                    : i < 0 
                                        ? Sign.NEGATIVE
                                        : Sign.ZERO));

        System.out.println(map);
    }
}

enum Sign {POSITIVE, NEGATIVE, ZERO}

這會產生以下輸出:

{ZERO=[0], POSITIVE=[1, 1], NEGATIVE=[-1, -1]}

注意:如果您希望將來在地圖中進行查找具有最佳性能,則可以使用EnumMap 看看這個答案 ,看看如何。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM