Похоже, вам нужна только сумма элементов, чтобы проверить, является ли она нечетной или четной. Чтобы знать это, достаточно проверить, является ли количество нечетных элементов нечетным или четным.
Вы можете разделить входные данные на нечетные и четные списки и решить, какой из них вернуть, исходя из размера нечетного List
:
public static List<Integer> oddOrEven(List<Integer> integers) {
Map<Boolean,List<Integer>>
oddsAndEvens = integers.stream()
.collect(Collectors.partitioningBy(i->i%2==0));
return oddsAndEvens.get(false).size() % 2 == 0 ? // check if there's an even number of odd
// elements, which means the sum is even
oddsAndEvens.get(true) : // return the even elements
oddsAndEvens.get(false); // return the odd elements
}
Тестирование:
System.out.println (oddOrEven(Arrays.asList (1,2,3,4,5)));
System.out.println (oddOrEven(Arrays.asList (1,2,3,4,5,3)));
Выход:
[1, 3, 5]
[2, 4]
EDIT:
В своем первоначальном ответе я пропустил шаг distinct()
, который должен быть выполнен после того, как мы решим, следует ли возвращать нечетные или четные элементы. Боюсь, это требует добавления второго Stream
конвейера:
public static List<Integer> oddOrEven(List<Integer> integers) {
Map<Boolean,List<Integer>>
oddsAndEvens = integers.stream()
.collect(Collectors.partitioningBy(i->i%2==0));
return oddsAndEvens.get(false).size() % 2 == 0 ?
oddsAndEvens.get(true).stream().distinct().collect(Collectors.toList()) :
oddsAndEvens.get(false).stream().distinct().collect(Collectors.toList());
}
или (с предложением Хольгера):
public static List<Integer> oddOrEven(List<Integer> integers) {
Map<Boolean,List<Integer>>
oddsAndEvens = integers.stream()
.collect(Collectors.partitioningBy(i->i%2==0));
return oddsAndEvens.get(oddsAndEvens.get(false).size() % 2 == 0)
.stream()
.distinct()
.collect(Collectors.toList());
}