Начну со своего вопроса:
У меня есть массив:
int[] arr = { 1,2,3,4,5 };
, я хочу сохранить значения в List<Integer> li
вот так: 14,13,12,11,10
Как эти ценности попали в Список li
вот так??
Наши начальные числа — 1,2 ,3 ,4 и 5. Мы можем вычислить следующие суммы, используя четыре из пяти целых чисел:
Мой подход и мысли:
Я думал, что у меня уже есть int [] arr
, поэтому я сделаю это для потоковой передачи, теперь я буду filter
выводить каждый элемент один за другим, sum
отдыхать в каждой итерации и добавлять это в список li
.
List<Integer> li = IntStream.range(0,1).filter(i-> arr[i] !=i).sum();
^^ Это не сработало, я думаю, могу ли я сделать это, как показано ниже?
IntStream.range(0,1).filter(i-> filter(this is anotherfilter)).sum();
Я не могу этого понять, я хочу решить эту проблему с потоками и java-8.
@Naman, никаких повторяющихся элементов
Вы можете разбить его на два шага и выполнить операцию как:
int[] arr = { 1,2,3,4,5 };
int total = Arrays.stream(arr).sum(); // total of the array
List<Integer> output = Arrays.stream(arr)
.mapToObj(integer -> total - integer) // (total - current) value as element
.collect(Collectors.toList());
что делать mapToObj ?? Я нахожу это сложным, я часто вижу карту, карту и т. д. Любая соответствующая статья, чтобы изучить эту концепцию?
Когда я ввожу ввод 7 ,69, 2 ,221, 8974
, первый и последний номера списка равны 299 9266, но они должны быть 299 9271
@JokaLee, так как это IntStream
, вы можете поочередно использовать boxed()
для преобразования в Stream<Integer>
, а затем просто использовать map
@JokaLee вы начинаете с массива int
, но хотите List
из Integer
. Итак, вам нужно либо boxed()
, либо mapToObj(…)
, чтобы добраться из IntStream
в Stream<Integer>
.
@JokaLee, почему это должно быть 9271
, сумма 69, 2 ,221, 8974
будет 9266
, разве это не то, что вы хотели?
@JokaLee ваше представление о «первом» и «последнем» кажется неправильным. Это не то же самое, что «самый маленький» и «самый большой», если только вы не отсортируете свой массив.
да, теперь я понял, Хольгер, я искал мин и макс. Спасибо, вы кажется дальновидным +1
IntStream.range(0, arr.length)
.map(x -> IntStream.of(arr).sum() - arr[x])
.forEachOrdered(System.out::println);
Или IntStream.of(arr).sum()
можно вычислить только один раз как одну переменную.
Есть ли какой-нибудь пост SO, в котором примеры вложены filter() с примером?
@JokaLee извините, я не понимаю. какой у Вас вопрос?
Я хочу узнать, как мы можем написать фильтр внутри фильтра в сложном сценарии, есть ли какой-либо ответ на stackoverflow с примером? Спасибо, сэр, за все ответы здесь.
Supplier<IntStream> supplier = () -> IntStream.range(1, 6);
supplier.get()
.map(integer -> supplier.get().sum() - integer)
.forEach(item -> System.out.println(item));
Вместо для каждого вы можете использовать собирать (Коллекторы. в Список ()) для сбора целых чисел в список
может ли исходный массив иметь повторяющиеся элементы? что будет вашим выходом для
int[] arr = { 1,2,3,4,5 ,6,4,2};
и подумайте, что ваша текущая логика сделает с этим вводом.