我的List定义如下:
List<Integer> list1 = new ArrayList<>();
list1.add(1);
list1.add(2);
如何使用Java 8的Stream API将List的每个元素增加一个(即以List [2,3]
结束)而不创建新的List?
答案 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
一样
但是没有必要在这里使用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)
您可以通过IntStream
与forEach
结合来迭代索引:
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;
};