有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在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));

共 (3) 个答案

  1. # 1 楼答案

    这是一个愿望,而不是一个解决方案!其他语言(如NodeJS/JavaScript)也有类似的循环,将两个参数传递给lambda。参数i是索引,参数j是容器中的项目(无容器类型)

    ints。forEach((i,j)——>;系统出来打印(“索引为${i},项目为${j}”,i,j))

  2. # 2 楼答案

    lambda参数i获取集合中项目的值,而不是索引。您正在减去1,因为这些值恰好比它们的索引大一

    如果你试过

    List<Integer> ints = Stream.of(10,20,40,30,50).collect(Collectors.toList());
    ints.forEach((i)-> System.out.print(ints.get(i-1)+ " "));
    

    你会发现代码不太好用

    您应该能够简单地执行(不需要执行get调用)

    ints.forEach((i)-> System.out.print(i + " "));
    

    你的lambda和你提议的for循环不是等价的

    ints.forEach((i)-> System.out.print(ints.get(i-1)))
    

    相当于

    for(Integer i:ints)
       System.out.print(ints.get(i-1));
    

    注意保留负1


    针对该评论:

    lambda不是循环,而是函数(实际上无论如何)。在第一个示例中,forEach方法提供了循环功能。参数lambda是它在每次迭代中应该做的事情。这相当于for循环的

    在注释中的示例中,max是提供类似循环行为的函数。它将迭代(循环)项以找到最大值。您提供的lambda i -> i将是一个身份函数。它接受一个参数并返回未修改的对象

    假设您有一个更复杂的对象,并且希望在一个特定的成员(例如^{)上比较它们。然后你可以使用i -> i.GetHighScore()来获得得分最高的对象

  3. # 3 楼答案

    Java中的列表索引是基于0的

    因此:

    ints.get(0) == 1;
    ints.get(1) == 2;
    ints.get(2) == 3;
    //etc...
    

    你在呼叫ints。为每个“i”获取(i-1),其中“i”等于列表“ints”中每个元素的

    如果要调用ints.get(i),则获取的元素的索引等于1,2,3,4和5,而5不是包含5个元素的列表中的有效索引


    代码:

    ints.forEach((i)-> System.out.print(ints.get(i-1)+ " "));
    

    相当于:

    for(int i : ints ) {
        System.out.print(ints.get(i-1) + " ");
    }
    

    你的例子并不相同