如何使用Stream API更新Java 8中List中的每个元素

时间:2018-01-05 09:23:28

标签: java java-8 java-stream

我的List定义如下:

List<Integer> list1 = new ArrayList<>();
list1.add(1); 
list1.add(2);

如何使用Java 8的Stream API将List的每个元素增加一个(即以List [2,3]结束)而不创建新的List?

5 个答案:

答案 0 :(得分:17)

当您从 var d = new Date(); var month = new Array(); month[0] = "Jan"; month[1] = "Feb"; month[2] = "Mar"; month[3] = "Apr"; month[4] = "May"; month[5] = "Jun"; month[6] = "Jul"; month[7] = "Aug"; month[8] = "Sep"; month[9] = "Oct"; month[10] = "Nov"; month[11] = "Dec"; var n = month[d.getMonth()]; var y = d.getFullYear(); $("#value").sheetrock({ url: 'https://docs.google.com/spreadsheets/d/1XSVP75fJkq34gLHhwIsEWOC3My-6xnbVURk4U_wotD0/edit#gid=0', query: "select C where B = "+ y +" and A = '"+ n +"'", callback: draw }); function draw(data, sheetrock,response) { console.log(); // how to get the output from sheetrock as a variable? } 创建Stream时,不允许您根据“Non-interference” section of the package documentation中指定的List修改来源List。不遵守此约束可能会导致Stream或更糟糕的是,数据结构损坏而不会出现异常。

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

ConcurrentModificationException

就像Eran’s answer

一样

但是没有必要在这里使用IntStream.range(0, list1.size()).forEach(ix -> list1.set(ix, list1.get(ix)+1)); 。目标可以像

一样简单实现
Stream

这是Java 8中引入的a new List method,也允许平滑地使用lambda表达式。除此之外,还有一个众所周知的Iterable.forEach,漂亮的Collection.removeIf和就地List.sort方法,用于命名其他不涉及Stream API的新Collection操作。此外,Map界面有几个值得了解的新方法。

另请参阅官方文档中的“New and Enhanced APIs That Take Advantage of Lambda Expressions and Streams in Java SE 8”。

答案 1 :(得分:3)

Holger's answer几乎是完美的。但是,如果您关注整数溢出,那么您可以使用Java 8中发布的另一个实用程序方法:Math#incrementExact。如果结果溢出ArithmeticException,则会抛出int。方法参考也可以用于此,如下所示:

list1.replaceAll(Math::incrementExact);

答案 2 :(得分:1)

您可以通过IntStreamforEach结合来迭代索引:

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

然而,这与正常的for循环没什么不同,可能不太可读。

答案 3 :(得分:0)

将结果重新分配给list1

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

答案 4 :(得分:-1)

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;

    };