Java List forEach Lambda表达式 - 首元素和循环遍历所有元素

6
我可以像下面这样遍历所有列表元素:

list中的所有元素均可通过以下方式循环:

userList.forEach(user -> {
    System.out.println(user);
});

我想只打印列表的第一个元素的用户对象,但我应该循环所有元素。如何实现?

1
如果你不对其他元素做任何操作,为什么要循环呢?你实际上想要实现什么?请注意,forEach() 不是遍历列表的唯一方法。使用最适合你用例的方法。 - JB Nizet
5个回答

4

看起来你想问如何打印第一个对象但是迭代剩余元素并执行一些其他逻辑,此时你可以选择:

if(!userList.isEmpty()) System.out.println(userList.get(0));
userList.subList(1, userList.size()).forEach(user -> ...);

1
如果您想对第一个用户应用特定逻辑,并继续循环其他用户,则可以使用条件来检查第一个对象是否为当前对象。根据我对您问题的理解,这就是您想要的。
userList.forEach(user -> {
    if (userList.get(0) == user)
        System.out.println("This is user with index 0");
    System.out.println(user + " All users including 0");
});

正如Aomine在评论中所说,每次检查列表的第一个元素可能不是一个好的解决方案,并且如果相同的用户对象在列表中重复出现,则可能无法正确工作,因此最好将逻辑分开处理。
// Do something with the first user only
if(!userList.isEmpty())
    System.out.println(userList.get(0));

// Do some stuff for all users in the list except the first one
userList.subList(1, userList.size()).forEach(user -> {
        System.out.println(user + " All users without 0");
);

// Do some stuff for all users in the list
userList.forEach(user -> {
        System.out.println(user + " All users");
);

另一种使用流的方法。
// Dealing with first user only
if (!userList.isEmpty()) {
    System.out.println("this is first user: " + userList.get(0));
}
// using stream skipping the first element
userList.stream().skip(1).forEach(user -> {
    System.out.println(user);
});

也可以使用迭代器方法。
// getting the iterator from the list
Iterator<String> users = userList.iterator();

// the first user
if(users.hasNext())
    System.out.println("this is first user :" + users.next());

// the rest of the users
users.forEachRemaining(user -> {
    System.out.println(user);
});

2
对我来说,这种方法似乎不够优化。在每次迭代中获取第一个项目,然后与“user”进行比较,我会在循环之前进行此检查。 - Ousmane D.
1
同时,根据user对象的来源,使用==可能无法正常工作。 - Óscar López
1
我编辑了答案,并以Aomine的评论为目标,只关注逻辑和答案,而不寻求更优化的解决方案。@ÓscarLópez 我不明白这是如何可能的,因为我正在循环列表,迭代中的对象应该始终与列表上的对象相同。 - Anddo
2
@Aomine,我同意,但是如果用户在列表中出现多次,表示相同的对象,那么我认为这可能会在问题中指出,但是如果用户作为不同的对象重复出现,这仍然可以工作,毕竟为什么我要在同一列表中重复用户对象!!!所以我认为用户很可能会在那里,但不是同一个对象,并且功能将按预期进行。但是,所有这些都取决于问题,这根本没有表明,因此需要做出假设 :) - Anddo
非常好的答案,多种解决方案为我遇到的类似问题打开了许多门。谢谢! - Muhammad Attia
显示剩余2条评论

0
这是使用for-each的解决方案。
List<String> userList = Arrays.asList("2","3","4");

        IntStream.range(0, userList.size()).forEach(i -> {
            if (i == 0)
                System.out.println(userList.get(i));
            else {
                System.out.println("do other stuff");
            }
        });

输出:

2
do other stuff
do other stuff

你喜欢这样检查吗: for (int i = 0; i < Long.MAX_VALUE; i++){ if (i == 0){} //...}` - zlakad

0

如果您正在使用lambda表达式,那么在JDK9中这里有另一种解决方案:

IntStream.range(0, userList.size())
         .peek(i -> {if(i == 0) System.out.println(userList.get(i));})
         .dropWhile(i -> i == 0)
         .forEach(i -> /* some other logic here */ );

就个人而言,以及对于生产代码而言,我会选择我的另一个答案,但如果你只是在玩lambda,那么上面的方法也是你可以采用的。


-1

这应该可以工作

userList.foreach(user -> {
    If(user == userList.get(0){
        System.out.println(user)
    }
})

2
对我来说,这种方法似乎不够优化。在每次迭代中获取第一个项目,然后与“user”进行比较,我会在循环之前进行此检查。 - Ousmane D.
1
如果同一个用户在列表中出现多次,它将无法工作。 - JB Nizet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接