如何使用流API在Java8中更新列表中的每个元素

如何使用流API在Java8中更新列表中的每个元素,java,java-8,java-stream,Java,Java 8,Java Stream,我的清单定义如下: List<Integer> list1 = new ArrayList<>(); list1.add(1); list1.add(2); List list1=new ArrayList(); 清单1.添加(1); 清单1.添加(2); 如何使用Java 8的流API将列表中的每个元素增加一个(即最终得到一个列表),而不创建新的列表?您可以通过IntStream与forEach组合来迭代索引: IntStream.range(0,list1.si

我的清单定义如下:

List<Integer> list1 = new ArrayList<>();
list1.add(1); 
list1.add(2);
List list1=new ArrayList();
清单1.添加(1);
清单1.添加(2);

如何使用Java 8的流API将列表中的每个元素增加一个(即最终得到一个列表),而不创建新的列表?

您可以通过
IntStream
forEach
组合来迭代索引:

IntStream.range(0,list1.size()).forEach(i->list1.set(i,list1.get(i)+1));

但是,这与正常的for循环没有太大区别,可能可读性较差。

将结果重新分配给
list1

list1 = list1.stream().map(i -> i+1).collect(Collectors.toList());

列表创建
时,不允许按照中的指定从
修改源
列表
。不遵守此约束可能会导致
ConcurrentModificationException
,或者更糟糕的是,数据结构损坏而未获得异常

使用Java流直接操作列表的唯一解决方案是创建一个不迭代列表本身的流,即迭代索引的流,如

IntStream.range(0, list1.size()).forEach(ix -> list1.set(ix, list1.get(ix)+1));
喜欢

但是这里不需要使用
流。这个目标可以简单地实现

list1.replaceAll(i -> i + 1);
这是在Java8中引入的,也允许平滑地使用lambda表达式。除此之外,还有可能众所周知的nice和in-place方法来命名其他不涉及流API的新收集操作。此外,该接口还提供了一些值得了解的新方法

另请参见官方文档中的“”。

几乎完美无瑕。但是,如果您关心整数溢出,那么可以使用Java 8中发布的另一个实用程序方法:。如果结果溢出了
int
,这将抛出一个
算术异常。方法参考也可用于此,如下所示:

list1.replaceAll(Math::incrementExact);
公共静态函数applyDiscount=(
objectOfMAp)->{
objectOfMAp.values().forEach(listfLong->{
LongStream.range(0,((LinkedList)listfLong.size()).forEach(索引->{
整数位置=(int)索引;
双l=listfLong.get(位置)-(10.0/100*listfLong.get(位置));
set(位置,l.longValue());
});
});
返回映射对象;
};

来自OP“不创建新列表”。您正在创建一个新列表。公平地说,不清楚他指的是像
新变量
新对象
这样的新列表。为什么不想创建一个新列表?@ifly6例如,您可能有一种方法可以通过副作用工作。简单地说,使用
.map()
进行任何操作。见@bentaye AnswerDown投票:缺乏研究Up投票:好问题
public static Function<Map<String, LinkedList<Long>>, Map<String, LinkedList<Long>>> applyDiscount = (

            objectOfMAp) -> {


        objectOfMAp.values().forEach(listfLong -> {


            LongStream.range(0, ((LinkedList<Long>) listfLong).size()).forEach(index -> {

                Integer position = (int) index;

                Double l = listfLong.get(position) - (10.0 / 100 * listfLong.get(position));

                listfLong.set(position, l.longValue());

            });

        });

        return objectOfMAp;

    };