使用filter()一一过滤掉元素

时间:2019-05-22 10:40:37

标签: java java-8 java-stream

我将从我的问题开始:

我有一个数组:

int[] arr = { 1,2,3,4,5 };,我想像这样将值存储到List<Integer> li14,13,12,11,10

这些值如何像这样进入列表li

我们的初始号码为 1,2,3,4 5 。我们可以使用五个整数中的四个来计算以下总和:

  • 如果我们将除1以外的所有值相加,则总和为14。
  • 如果我们将除2以外的所有值相加,则总和为13。
  • 如果我们将除3以外的所有值相加,则总和为12。
  • 如果我们将除4以外的所有值相加,则总和为11。
  • 如果我们将除5以外的所有值相加,则总和为10。

我的方法和想法:

我以为我已经有了一个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来解决这个问题。

3 个答案:

答案 0 :(得分:4)

您可以将其分为两个步骤,并按以下步骤执行操作:

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());

答案 1 :(得分:1)

IntStream.range(0, arr.length)
             .map(x -> IntStream.of(arr).sum() - arr[x])
             .forEachOrdered(System.out::println);

IntStream.of(arr).sum()作为一个变量只能计算一次。

答案 2 :(得分:0)

    Supplier<IntStream> supplier = () -> IntStream.range(1, 6);
    supplier.get()
             .map(integer -> supplier.get().sum() - integer)
             .forEach(item -> System.out.println(item));

代替 forEach ,您可以使用 collect(Collectors.toList())将整数收集到列表中