Потребитель берет только одну итерацию, поэтому он более эффективен, и он несет единственную ответственность: деление чисел на три списка на основе их знака.
Для этого случаяЯ, вероятно, использовал бы простой цикл 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
.Взгляните на этот ответ чтобы узнать как.