如何从数组的所有元素中减去一个常数?

时间:2018-08-05 20:33:11

标签: java java-8 java-stream

我有一个数组,例如,我想从数组的所有元素中减去7。除了以下逻辑,我该怎么做。

[87]

任何与之相关的信息流都会有所帮助。

编辑-不必是数组。也可以是ArrayList。

3 个答案:

答案 0 :(得分:7)

对于流,您可以像这样使用map

int[] array = {-1, 8, 9};
array = Arrays.stream(array)
        .map(i -> i - 7)
        .toArray();

或者如果您使用列表,则可以使用:

List<Integer> array = new ArrayList<>(Arrays.asList(-1, 8, 9));
array = array.stream()
        .map(i -> i - 7)
        .collect(Collectors.toList());

答案 1 :(得分:3)

虽然流似乎是“新奇的”,但您应该记住实际发生的情况。

代码:

array = Arrays.stream(array)
             .map(i -> i - 7)
             .toArray();

实际上是这样的(但更糟的是...):

int[] newArray = new int[array.length];
for (int i = 0; i < array.length; i++) {
     newArray[i] = array[i]-7;
}
array = newArray;

因此您可以轻松地看到它与您自己的代码相比效率低下。

并不是说它不起作用,但请记住。

  • 如果它是一个数组列表,那么可以使用lst.set(i,lst.get(i)-7)...

答案 2 :(得分:3)

流应该是无副作用的,因此,流不是修改数组或列表内容的好选择。不过,类似的事情也是可能的。

首先 ArrayList 。我认为这是一种不错的方法(然后for循环也很不错):

    List<Integer> list = new ArrayList<>(List.of(11,  14, 9, 13));
    list.replaceAll(e -> e - 7);
    System.out.println(list);
  

[4、7、2、6]

replaceAll方法是Java 8中引入的。

对于 int数组,我认为没有很好的解决方案。您可能会这样做:

    int[] array = { 11,  14, 9, 13 };
    Arrays.setAll(array, ix -> array[ix] - 7);
    System.out.println(Arrays.toString(array));
  

[4、7、2、6]

我觉得它不自然也不容易阅读,因此更喜欢使用for循环。

如果您碰巧有一个非null的数组Integer,则可以通过Arrays.asList使用上述第一种方法:

    Integer[] array = { 11,  14, 9, 13 };
    Arrays.asList(array).replaceAll(e -> e - 7);
    System.out.println(Arrays.toString(array));
  

[4、7、2、6]