原文: https://beginnersbook.com/2017/10/java-8-foreach/

在 Java 8 中,我们有一个新引入的forEach方法来迭代 Java 中的集合。在本指南中,我们将学习如何使用forEach()forEachOrdered()方法来循环特定的集合和流。

Java 8 - forEach迭代Map

  1. import java.util.Map;
  2. import java.util.HashMap;
  3. public class Example {
  4. public static void main(String[] args) {
  5. Map<Integer, String> hmap = new HashMap<Integer, String>();
  6. hmap.put(1, "Monkey");
  7. hmap.put(2, "Dog");
  8. hmap.put(3, "Cat");
  9. hmap.put(4, "Lion");
  10. hmap.put(5, "Tiger");
  11. hmap.put(6, "Bear");
  12. /* forEach to iterate and display each key and value pair
  13. * of HashMap.
  14. */
  15. hmap.forEach((key,value)->System.out.println(key+" - "+value));
  16. /* forEach to iterate a Map and display the value of a particular
  17. * key
  18. */
  19. hmap.forEach((key,value)->{
  20. if(key == 4){
  21. System.out.println("Value associated with key 4 is: "+value);
  22. }
  23. });
  24. /* forEach to iterate a Map and display the key associated with a
  25. * particular value
  26. */
  27. hmap.forEach((key,value)->{
  28. if("Cat".equals(value)){
  29. System.out.println("Key associated with Value Cat is: "+key);
  30. }
  31. });
  32. }
  33. }

输出:

Java 8 `forEach`方法 - 图1

Java 8 - forEach迭代List

在这个例子中,我们使用forEach()方法迭代ArrayList。在forEach中,我们使用 lambda 表达式来打印列表的每个元素。

  1. import java.util.List;
  2. import java.util.ArrayList;
  3. public class Example {
  4. public static void main(String[] args) {
  5. List<String> fruits = new ArrayList<String>();
  6. fruits.add("Apple");
  7. fruits.add("Orange");
  8. fruits.add("Banana");
  9. fruits.add("Pear");
  10. fruits.add("Mango");
  11. //lambda expression in forEach Method
  12. fruits.forEach(str->System.out.println(str));
  13. }
  14. }

输出:

  1. Apple
  2. Orange
  3. Banana
  4. Pear
  5. Mango

我们也可以在forEach()方法中使用方法引用,如下所示:

  1. fruits.forEach(System.out::println);

Java 8 - 迭代流的forEach方法

在这个例子中,我们使用forEach()方法在 Java 中迭代

  1. import java.util.List;
  2. import java.util.ArrayList;
  3. public class Example {
  4. public static void main(String[] args) {
  5. List<String> names = new ArrayList<String>();
  6. names.add("Maggie");
  7. names.add("Michonne");
  8. names.add("Rick");
  9. names.add("Merle");
  10. names.add("Governor");
  11. names.stream() //creating stream
  12. .filter(f->f.startsWith("M")) //filtering names that starts with M
  13. .forEach(System.out::println); //displaying the stream using forEach
  14. }
  15. }

输出:

  1. Maggie
  2. Michonne
  3. Merle

Java - Stream forEachOrdered()方法示例

对于顺序流,元素的顺序与源中的顺序相同,因此无论使用forEach还是forEachOrdered,输出都是相同的。但是,在处理并行流时,您总是希望在订单对您很重要时使用forEachOrdered()方法,因为此方法可确保元素的顺序与源相同。让我们举个例子来理解forEach()forEachOrdered()之间的区别。

  1. import java.util.List;
  2. import java.util.ArrayList;
  3. public class Example {
  4. public static void main(String[] args) {
  5. List<String> names = new ArrayList<String>();
  6. names.add("Maggie");
  7. names.add("Michonne");
  8. names.add("Rick");
  9. names.add("Merle");
  10. names.add("Governor");
  11. //forEach - the output would be in any order
  12. System.out.println("Print using forEach");
  13. names.stream()
  14. .filter(f->f.startsWith("M"))
  15. .parallel()
  16. .forEach(n->System.out.println(n));
  17. /* forEachOrdered - the output would always be in this order:
  18. * Maggie, Michonne, Merle
  19. */
  20. System.out.println("Print using forEachOrdered");
  21. names.stream()
  22. .filter(f->f.startsWith("M"))
  23. .parallel()
  24. .forEachOrdered(n->System.out.println(n));
  25. }
  26. }

输出:

  1. Print using forEach
  2. Merle
  3. Maggie
  4. Michonne
  5. Print using forEachOrdered
  6. Maggie
  7. Michonne
  8. Merle

参考文献: