如何使用Java 8对列表的某些特定元素执行一些数学运算?

时间:2019-01-14 13:38:22

标签: java java-8

基于某些条件,我只想对列表的特定元素执行某些操作。

我有一个这样的整数列表:

List<Integer> list = new ArrayList(Arrays.asList(30,33,29,0,34,0,45));

我想从每个元素中减去1,但不包括0。

我尝试了一些方法,例如应用Java 8的过滤器,但是它从列表中删除了零值。 我尝试应用为流API提供的其他方法,例如foreach() or .findFirst(),.findAny(),但此方法无效。

List<Integer> list2 = list.stream().filter(x -> x > 0).map(x -> x - 1).collect(Collectors.toList());
//list.stream().findFirst().ifPresent(x -> x - 1).collect(Collectors.toList()); //This is giving error
list.stream().forEach(x ->x.); //How to use this in this case

实际结果:[29,32,28,-1,33,-1,44]

预期结果:[29,32,28,0,33,0,44]

4 个答案:

答案 0 :(得分:6)

list.stream()
    .map(x -> x == 0 ? x : x - 1)
    .collect(Collectors.toList());

答案 1 :(得分:5)

在示例中,您可以使用BufferedWriter方法:

Math.max

在您的情况下:

list.stream()
    .map(x -> Math.max(0, x - 1))
    .collect(Collectors.toList());

答案 2 :(得分:2)

非流版本正在使用replaceAll

list.replaceAll(x -> x != 0 ? x - 1 : x);

答案 3 :(得分:0)

另一种解决方案:

IntStream.range(0, list.size())
         .map(e -> list.get(e) == 0 ? list.get(e) : list.get(e) - 1)
         .forEach(System.out::println);

输出:

  

29 32 28 0 33 0 44