Дано - входящий List<Integer>
. По нему нужно пройтись через Stream
, если сумма всех чисел чётная - удалить все чётные. Если нечётная - удалить все нечётные.
Желательно сделать это в один stream()
.
Основано на предположении о том что четная сумма чисел или нет зависит только от количества нечетных чисел в массиве.
—-
Сначала распиливаем массив пополам на четные и нечетные при помощи специального коллектора
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);
}
}
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());
}
}
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());
}
!
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Проблема вот в чёмУ меня есть класс
Пишу клиент-серверное приложение, от сервера клиенту сообщение приходит, а от клиента серверу не приходитПричём не выводится никакой ошибки,...
Внезапно возникла проблема при считывании меток, стандартный метод