Удаление элементов из List<Integer> через Stream

91
19 апреля 2021, 20:40

Дано - входящий List<Integer>. По нему нужно пройтись через Stream, если сумма всех чисел чётная - удалить все чётные. Если нечётная - удалить все нечётные.

Желательно сделать это в один stream().

Answer 1

Основано на предположении о том что четная сумма чисел или нет зависит только от количества нечетных чисел в массиве.

—-

Сначала распиливаем массив пополам на четные и нечетные при помощи специального коллектора

Collectors. partitioningBy()

который в свою очередь ждет на вход лямбду, которая будет вызываться для определения в какую из двух выходных коллекторов положить элемент, и коллектор для формирования выходного значения.

Условием будет признак четности числа, соответственно на выходе будет 2 коллекции:

  • с четными элементами

  • с нечетными элементами

Затем считаем кол-во элементов в коллекции с нечетными, если их нечетное количество то и вся сумма нечетная.

По этому признаку возвращаем одну из двух коллекций, найденных на первом шаге

https://ideone.com/KCm9pq

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import static java.util.stream.Collectors.*;
 class Ideone {
    public static void main(String[] args) {
        System.out.println(get(Arrays.asList(1,2,3,4,5)));    // [2, 4]
        System.out.println(get(Arrays.asList(1,2,3,4,5,-1))); // [1, 3, 5, -1]
    }
    static List<Integer> get(List<Integer> integers){
        Map<Boolean, List<Integer>> map = integers.stream()
             .collect(partitioningBy(x -> x % 2 == 0, toList()));
        return map.get(map.get(false).size() % 2 != 0);
    }
}
Answer 2
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class Main {
    public static void main(String[] args) {        
        List <Integer> listInt = Arrays.asList(5,7,8,3,2,5);        
        List <Integer> result = listInt.stream().reduce(0, (a, b) -> a + b)%2 == 0 ? 
                filter(listInt, p->p%2==0) : filter(listInt, p->p%2!=0);
        System.out.println(result);        
    }
    private static List <Integer> filter(List <Integer> listInt, Predicate <Integer> predicate) {
        return listInt.stream().filter(predicate).collect(Collectors.toList());
    }
}
Answer 3
public class Streams {
    public static List<Integer> oddOrEven(List<Integer> integers) {
        return integers
                .stream()
                .filter(integers.stream().mapToInt(Integer::intValue)
                        .sum() % 2 != 0 ? n -> n % 2 == 0 : n -> n % 2 != 0)
                .collect(Collectors.toList());
    }
}
Также можно так, чтобы избежать дублирования кода:
    public class Streams {
        public static List<Integer> oddOrEven(List<Integer> integers) {
            int mod = integers.stream().mapToInt(Integer::intValue)
            .sum() % 2;
        
        return integers
            .stream()
            .filter(n -> n % 2 != mod)
            .collect(Collectors.toList());
        }
    !
READ ALSO
Как в java hibernate создать колонку в бд, если она остутсвует

Как в java hibernate создать колонку в бд, если она остутсвует

Проблема вот в чёмУ меня есть класс

95
Пишу клиент-серверное приложение, от сервера клиенту сообщение приходит, а от клиента серверу не приходит

Пишу клиент-серверное приложение, от сервера клиенту сообщение приходит, а от клиента серверу не приходит

Пишу клиент-серверное приложение, от сервера клиенту сообщение приходит, а от клиента серверу не приходитПричём не выводится никакой ошибки,...

97
Считывание меток через метод RFIDWithUHF.readTagFromBuffer не возвращает Tid, а только EPC

Считывание меток через метод RFIDWithUHF.readTagFromBuffer не возвращает Tid, а только EPC

Внезапно возникла проблема при считывании меток, стандартный метод

111
Коллекция из повторяющихся элементов в строке

Коллекция из повторяющихся элементов в строке

Нужно составить список нужных фрагментов из строки

84