在JAVA中使用lambda表达式的foreach for循环
我的代码:
List<Integer> ints = Stream.of(1,2,4,3,5).collect(Collectors.toList());
ints.forEach((i)-> System.out.print(ints.get(i-1)+ " "));
输出:
1 2 3 4 5
我的问题是为什么在get方法中我必须是i-1?i-1是否能防止边界外问题
下面的代码是否与for循环迭代类似
(i)-> System.out.print(ints.get(i-1))
那么上面的代码等于这个吗
for(Ineger i:ints)
System.out.print(ints.get(i));
# 1 楼答案
这是一个愿望,而不是一个解决方案!其他语言(如NodeJS/JavaScript)也有类似的循环,将两个参数传递给lambda。参数i是索引,参数j是容器中的项目(无容器类型)
ints。forEach((i,j)——>;系统出来打印(“索引为${i},项目为${j}”,i,j))
# 2 楼答案
lambda参数
i
获取集合中项目的值,而不是索引。您正在减去1
,因为这些值恰好比它们的索引大一如果你试过
你会发现代码不太好用
您应该能够简单地执行(不需要执行
get
调用)你的lambda和你提议的for循环不是等价的
相当于
注意保留负1
针对该评论:
lambda不是循环,而是函数(实际上无论如何)。在第一个示例中,
forEach
方法提供了循环功能。参数lambda是它在每次迭代中应该做的事情。这相当于for循环的体在注释中的示例中,
max
是提供类似循环行为的函数。它将迭代(循环)项以找到最大值。您提供的lambdai -> i
将是一个身份函数。它接受一个参数并返回未修改的对象假设您有一个更复杂的对象,并且希望在一个特定的成员(例如^{)上比较它们。然后你可以使用
i -> i.GetHighScore()
来获得得分最高的对象# 3 楼答案
Java中的列表索引是基于0的
因此:
你在呼叫ints。为每个“i”获取(i-1),其中“i”等于列表“ints”中每个元素的值
如果要调用
ints.get(i)
,则获取的元素的索引等于1,2,3,4和5,而5不是包含5个元素的列表中的有效索引此代码:
相当于:
你的例子并不相同